Python VLC - 获取位置轮询率解决方法



我使用 Python VLC 在 pyqt 中构建自定义播放应用程序。我已经绘制了一个漂亮的自定义滑块来跟踪视频,但遇到了一个烦人的问题。

无论我多久告诉我的滑块更新一次,它都非常小故障(每 1/4 秒左右跳一次(并且看起来断断续续(只是时间线,而不是视频(。

深入研究它,我了解到

media_player.get_position()

轮询率相当低。它经常返回相同的值,然后在下次给出新值时大量跳跃。

所以现在我运行了一些测试指标,发现它倾向于每 0.25-0.3 秒更新一次。所以现在我有一个系统,它基本上存储新值进入的最后一个值和上次系统时间,以及返回值中的最后一个跳跃距离,并对这些东西进行一些基本的数学运算,以在民意调查之间伪造适当的线性时间轴数据,以制作非常平滑的时间轴滑块。

问题是,这假设我每 0.25-0.3 秒的值在机器、硬件、视频帧速率等之间是一致的。

有谁知道更好的解决方案?

也许有一种提高 VLC 轮询率的方法,以便一开始就给我更好的数据 - 或者一些更好的数学来处理平滑?

谢谢

使用get_position()返回一个介于 0.0 和 1.0 之间的值,本质上是当前位置相对于总运行时间的百分比。
相反,您可以使用get_time()在 1000 秒内返回当前位置。

print (self.player.get_time()/1000)将在几秒钟内打印当前位置。

您也可以为 vlceventEventType.MediaPlayerTimeChanged注册一个回调,如 @mtz 给出的另一个答案中所述,
即 其中self.player定义为:

self.Instance = vlc.Instance()
self.player = self.Instance.media_player_new()

然后:

self.vlc_event_manager = self.player.event_manager()
self.vlc_event_manager.event_attach(vlc.EventType.MediaPlayerTimeChanged, self.media_time_changed)
def media_time_changed(self,event):
print (event.u.new_time/1000)
print (self.player.get_time()/1000)
print (self.player.get_position())

尝试改用libvlc_MediaPlayerPositionChangedlibvlc_MediaPlayerTimeChanged媒体播放器事件。

https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__event.html#gga284c010ecde8abca7d3f262392f62fc6a4b6dc42c4bc2b5a29474ade1025c951d

最新更新