Python中的GStreamer计时

Python中的GStreamer计时,python,gstreamer,playbin2,Python,Gstreamer,Playbin2,在我的Python程序中,我使用GStreamer的playbin和textoverlay来播放视频文件并在上面显示一些文本。 这很好:如果我更改textoverlay的text属性,则会显示新文本 但是现在我想根据视频的当前位置/时间设置文本,就像字幕一样 我读到了关于管道时钟、缓冲区时间戳、段事件和外部计时器的信息,它们每x毫秒查询一次当前时间。但是,了解时间变化的最佳实践是什么,以便我能够尽快显示正确的文本 与视频真正同步的最佳方法是使用cairooverlay元素,并根据帧的实际时间戳直

在我的Python程序中,我使用GStreamer的playbin和textoverlay来播放视频文件并在上面显示一些文本。 这很好:如果我更改textoverlay的text属性,则会显示新文本

但是现在我想根据视频的当前位置/时间设置文本,就像字幕一样


我读到了关于管道时钟、缓冲区时间戳、段事件和外部计时器的信息,它们每x毫秒查询一次当前时间。但是,了解时间变化的最佳实践是什么,以便我能够尽快显示正确的文本

与视频真正同步的最佳方法是使用cairooverlay元素,并根据帧的实际时间戳直接在管道内部进行渲染。或者,也可以编写自己的元素

如果不需要超精确计时,最简单的解决方案是使用管道时钟。一旦它启动,您就可以从管道中获取它,然后可以根据您想要的时间或间隔创建单次或周期性时钟ID。然后在时钟上使用async_wait方法


要获取对应于管道位置1秒的时钟时间,您需要在管道的基准时间上加1秒,即100000000。您可以在创建时钟ID时使用该值。

我编写了自己的GstVideo.VideoFilter插件,用于提取帧的时间戳。该时间戳用于确定正确的文本,然后使用GstTextOverlay显示该文本,GstTextOverlay是管道中的下一个元素。我认为这是在准确性和简单性之间的一个很好的折衷。