0

我正在编写一个基于 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)并且不会继续前进,因此我看到 NO NEXT TRACK。

我使用 ( vlc.stop(),vlc.set_media而不是vlc.set_mrl) 尝试了此代码的不同变体,但没有任何效果

4

2 回答 2

0

最后......我认为最好的选择是在 python 2 线程上制作多线程应用程序:

  1. 主线程 - gtk.loop 并显示其他人认为的视频
  2. 进行媒体切换的附加线程。

有一段时间我害怕多线程,但现在我知道这是完成这项任务的最佳方式

于 2013-03-08T07:28:08.933 回答
0

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

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

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

于 2020-12-30T20:07:22.607 回答