使用pafy和python-vlc播放YouTube视频时player.stop()失效如何解决
问题原因
player变量是**pune命令分支内的局部变量**,执行oprește分支的停止逻辑时,访问的player要么是未定义变量,要么不是之前创建的播放实例,自然无法控制正在运行的播放器。- 每次调用
run函数触发pune命令都会重新创建新的VLC实例和播放器对象,旧的播放器对象会丢失引用,无法进行后续控制。
修复方案
把播放器实例提到函数外部,全局维护同一个VLC实例和播放器对象,保证两个命令分支访问的是同一个实例,同时增加状态判断避免无播放内容时调用停止接口报错,修复后代码如下:
# 播放器相关实例提到函数外部全局维护 vlc_instance = vlc.Instance("--no-video") player = vlc_instance.media_player_new() def run(command, args, voice_instance): global player if command == "pune": search_query = " ".join(args) result = YoutubeSearch(search_query, max_results=10).to_dict()[0] video_title = result["title"] url_suffix = result["url_suffix"] url = f"https://www.youtube.com/{url_suffix}" video = pafy.new(url) best = video.getbest() playurl = best.url Media = vlc_instance.media_new(playurl) Media.get_mrl() player.set_media(Media) voice_instance.say(f'Pun {video_title}') player.play() if "oprește" in command: print('1') # 先判断播放状态再调用停止,避免异常 if player.is_playing(): player.stop() print('2')
如果这段逻辑属于类方法,不需要用全局变量,把vlc_instance和player改成类的实例属性即可,逻辑和上述方案一致。
内容的提问来源于stack exchange,提问作者Mihai Cristian
相关产品推荐
相关产品推荐

