pygtk vlc播放器不播放下一首曲目

时间:2013-02-28 08:14:27

标签: pygtk vlc libvlc

我正在写一个基于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)尝试此代码的不同变体,但没有任何效果

2 个答案:

答案 0 :(得分:0)

最后.... 我认为最好的选择是在python上创建多线程应用程序 2个主题:

  1. 主线程 - gtk.loop并显示其他一些视频
  2. 进行媒体切换的其他线程。
  3. 有一段时间我害怕多线程,但现在我知道这是完成这项任务的最佳方式

答案 1 :(得分:0)

对于那些在 C# (Xamarin) 中面临类似问题的人,根据 VLC 文档,从绑定到对象的事件中调用 VLC 对象可能会冻结应用程序。所以他们说在触发事件中使用下面的代码。

 ThreadPool.QueueUserWorkItem(_ => PlayNext());
    

一个例子是在 EndReach 事件中调用上面的代码。 其中 PlayNext() 是您自己的自定义方法,用于处理您要执行的下一个操作。 在看到那部分文档之前,我为此苦苦挣扎了大约一天。