Python开发VLC播放器如何在主进程获取播放结束信号切换下一首
实现自动切歌的修改方案
你现在已经成功绑定了播放停止的事件回调,该回调会在歌曲播放完成后自动触发,不需要额外在主进程中监听信号,直接在end_call_back回调函数中处理下一首播放逻辑即可,只需要解决回调内无法访问播放器实例、播放列表的问题即可,具体修改如下:
1. 提前准备播放列表和播放索引
先把需要循环播放的歌曲放到统一的列表中,同时记录当前正在播放的歌曲下标,方便切歌时索引递增寻址。
2. 调整回调函数传入必要参数
可以用偏函数、全局变量或者类属性的方式,让回调内能访问播放器、播放列表、当前索引这几个变量,推荐用非全局的方式兼容性更高,示例代码如下:
import vlc from functools import partial # 播放结束回调,额外接收播放器、播放列表、当前索引引用作为参数 def end_call_back(event, player, playlist, current_idx): print('call:', 'a song finished') # 计算下一首的索引,到末尾就切回第一首,不需要循环可以加边界判断停止播放 next_idx = (current_idx[0] + 1) % len(playlist) # 播放下一首 player.play(playlist[next_idx]) # 更新当前索引,这里用列表封装是为了可以在回调里修改值,普通int为不可变类型无法修改外部值 current_idx[0] = next_idx if "__main__" == __name__: app = App() # 替换成你自己的播放列表 playlist = ['sample1.mp4', 'sample2.mp4', 'sample3.mp4'] # 初始播放索引 current_idx = [0] # 先播放第一首 app.player.play(playlist[current_idx[0]]) # 用partial把额外参数绑定到回调上 callback_with_args = partial(end_call_back, player=app.player, playlist=playlist, current_idx=current_idx) app.player.add_callback(vlc.EventType.MediaPlayerStopped, callback_with_args) # *如果回调未正常触发,可尝试替换事件类型为`vlc.EventType.MediaPlayerEndReached`验证* app.mainloop()
优化建议
如果你的App类是自定义封装的,更推荐把播放列表、当前索引、切歌逻辑都封装成App类的属性和方法,回调直接绑定类的内部方法,代码结构会更清晰,也不需要额外传参。
内容的提问来源于stack exchange,提问作者Youyou Hua
相关产品推荐
相关产品推荐

