如何在GStreamer中暂停视频录制

4
我创建了一个如下所示的流水线:

v4l2src -> tee -> queue -> encoder -> avimux -> filesink
           tee -> queue -> v4l2sink

现在我想暂停录制(保持回环,但暂停编码器),当我恢复时,我希望录制文件从我恢复的地方继续。我尝试使用gst_element_set_state:如果我暂停管道,则回环停止。如果我暂停编码器,则gst_element_set_state的返回值是ok,但编码器实际上并没有暂停。我也暂停了avimux,和编码器一样。有人能帮忙吗?非常感谢。

这有帮助吗?https://dev59.com/TlPTa4cB1Zd3GeqPjXVh - enthusiasticgeek
1个回答

4
请查看gst-plugins-bad中的camerabin / camerabin2。您想要做的事情可能有些复杂,我会解释一下。首先,您需要获取队列上的src-pad,将其设置为leaky=downstream并阻止src-pad。这会暂停视频。您还可以在队列后使用valve元素来实现同样的效果。如果幸运的话,一切都正常(对于avimux应该是这种情况)。对于其他格式(mp4mux)在暂停时需要通过pad-data-probe记住最后一个缓冲区的时间戳,并在取消暂停后获得第一个新缓冲区时从时间戳中减去暂停时间。否则,在生成的视频中将会出现暂停。这是因为mp4容器中的视频流可能是稀疏的。这也会影响其他格式。理论上,您还应该能够通过在取消暂停之后(在第一个缓冲区之前)向下游发送new-segment事件来处理此问题,但我没有尝试过。再次检查特别是在camerabin2中如何处理此问题。另外,考虑只使用camerabin2 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接