我正在写一个基于libvlc的小型自定义播放器。我已经使用了https://github.com/hartror/python-libvlc-bindings/blob/master/examples/gtkvlc.py中的大部分代码,这些代码就像我需要的那样播放单曲。
现在我想在之前完成后转到另一个轨道。为此,我捕获回调“EventType.MediaPlayerEndReached”并在回调处理程序中编写代码:
<------>def endCallback(self,event):
<------><------>fname = vlc_controller.GetNextTrack()['url']
<------><------>self.w.set_title(fname)
<------><------>self.vlc.player.set_mrl(fname)
<------><------>self.w.set_title('after set_mrl')
<------><------>self.vlc.player.play()
<------><------>self.w.set_title('after play')
现在当这段代码被执行时,它会卡在self.vlc.player.set_mrl(fname)
上并且不再继续,因此我看不到下一步。
我尝试使用(vlc.stop()
,vlc.set_media
代替vlc.set_mrl
)尝试此代码的不同变体,但没有任何效果
答案 0 :(得分:0)
最后.... 我认为最好的选择是在python上创建多线程应用程序 2个主题:
有一段时间我害怕多线程,但现在我知道这是完成这项任务的最佳方式
答案 1 :(得分:0)
对于那些在 C# (Xamarin) 中面临类似问题的人,根据 VLC 文档,从绑定到对象的事件中调用 VLC 对象可能会冻结应用程序。所以他们说在触发事件中使用下面的代码。
ThreadPool.QueueUserWorkItem(_ => PlayNext());
一个例子是在 EndReach 事件中调用上面的代码。 其中 PlayNext() 是您自己的自定义方法,用于处理您要执行的下一个操作。 在看到那部分文档之前,我为此苦苦挣扎了大约一天。