我一直在学习gstreamer,尝试编写一个带有多个视频文件并同步处理每个帧的应用程序(具体来说,我需要比较这些帧,直到转向下一帧)。 我已经建立了一个管道,它有几个独立的分支机构'
filesrc ---> decodebin ---> videoconvert ---> appsink
filesrc ---> decodebin ---> videoconvert ---> appsink
...
filesrc ---> decodebin ---> videoconvert ---> appsink
我设法独立处理帧。 我的问题是:
如何同步每个appsink,以便我可以将来自一个应用链接的帧与来自其他应用链的帧进行比较?
我想到的只是在新样本回调函数中进行轮询,看看其他应用程序是否已将其缓冲区存储在某些共享内存中,然后其中一个回调可以在所有缓冲区上运行。然而,这似乎是相当残酷和混乱的方法。你能帮我找一个更好的吗?
答案 0 :(得分:0)
GStreamer中的所有接收器(继承自GstBaseSink)都具有属性“sync”。这意味着它将把缓冲区时间戳同步到时钟时间,并且在时间结束之前不会给你缓冲区。如果启用此功能,则只需使用缓冲区上的GST_BUFFER_TIMESTAMP进行比较即可。