如何暂停gstreamer中的视频录制

时间:2011-09-23 05:30:23

标签: gstreamer recording

我创建了一个管道:

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

现在我想暂停录制(保持环回,但暂停编码器),当我恢复时,我希望重新编码文件从我恢复的地方继续。 我试着使用gst_element_set_state: 如果我暂停管道,环回停止。 如果我暂停编码器,gst_element_set_state的返回值是正常的,但编码器并没有真正暂停。 我暂停了avimux,与编码器一样。 有人可以帮忙吗?非常感谢。

1 个答案:

答案 0 :(得分:2)

请在gst-plugins-bad中查看camerabin / camerabin2。不幸的是,你想做的事情有点复杂。我会解释一下。对于初学者,您需要在队列中获取src-pad,将其设置为leaky = downstream并阻止src-pad。这会暂停视频。您也可以在队列后使用阀门元素获得相同的效果。如果你很幸运,一切都很好(应该是avimux的情况)。对于其他格式(mp4mux),您需要记住暂停时(通过pad-data-probe)最后一个缓冲区的时间戳,以及在取消暂停后获得第一个新缓冲区时,从时间戳中减去暂停时间。否则,您将在结果视频中暂停。这是因为mp4容器中的视频流可能很稀疏。这也会影响其他格式。从理论上讲,你也应该能够处理这个问题,方法是在取消暂停后(在第一个缓冲区之前)向下游发送一个新的段事件,但我还没有尝试过。再次检查它是如何完成的,尤其是在camerabin2中。还要考虑使用camerabin2:)