如何在Python 3.6中使用VLC等待音频文件播放完毕?
在Python 3.6中实现VLC音频播放结束等待的方案
我之前在Python 3.6里折腾VLC音频播放的时候,正好碰到过这个需求,分享几个亲测有效的实现方法给你:
方法一:利用VLC事件监听(推荐)
这是最稳妥的方式,VLC本身提供了事件回调机制,能精准捕捉播放结束的信号,不会有延迟或者误判。
首先确保你装对了兼容Python 3.6的python-vlc库——因为新版本已经不再支持3.6了,所以得指定版本安装:
pip install python-vlc==3.0.11115
然后看示例代码:
import vlc # 定义播放结束的回调函数 def on_media_finished(event): print("音频播放结束啦!") global play_done play_done = True # 初始化VLC实例和播放器 vlc_instance = vlc.Instance() player = vlc_instance.media_player_new() # 加载目标音频文件 audio_media = vlc_instance.media_new("你的音频文件路径.mp3") player.set_media(audio_media) # 绑定播放结束事件 event_manager = player.event_manager() event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, on_media_finished) # 标记播放状态 play_done = False # 开始播放 player.play() # 等待播放结束 while not play_done: pass # 播放完成后可以执行后续逻辑 print("现在可以处理播放结束后的任务了")
原理很简单:当播放器触发MediaPlayerEndReached事件时,会调用我们定义的回调函数,把play_done设为True,主循环就会退出,继续执行后续代码。
方法二:轮询播放状态(简单粗暴版)
如果觉得事件监听有点繁琐,也可以直接轮询播放器的状态,判断是否还在播放:
import vlc import time vlc_instance = vlc.Instance() player = vlc_instance.media_player_new() audio_media = vlc_instance.media_new("你的音频文件路径.mp3") player.set_media(audio_media) player.play() # 每隔0.5秒检查一次播放状态 while player.is_playing(): time.sleep(0.5) print("音频播放完成!")
这个方法代码更简洁,不过要注意time.sleep的间隔——别设太长,不然播放结束后会有明显延迟;设太短又会占用CPU,0.5秒是个比较均衡的选择。
几个注意点
- 一定要确认音频文件路径正确,相对路径的话要注意脚本的工作目录,不然会加载失败。
- 如果播放的是网络音频,
player.is_playing()会等到媒体真正开始播放后才返回True,所以不用担心加载时间的问题。 - Python 3.6的环境下,务必安装指定版本的
python-vlc,不然会出现兼容性报错。
内容的提问来源于stack exchange,提问作者Moustafa Mahmoud




