我使用 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)
将在几秒钟内打印当前位置。
您也可以为 vlcevent
EventType.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_MediaPlayerPositionChanged
或libvlc_MediaPlayerTimeChanged
媒体播放器事件。
https://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc__event.html#gga284c010ecde8abca7d3f262392f62fc6a4b6dc42c4bc2b5a29474ade1025c951d