如何在gstreamer中暂停视频录制

如何在gstreamer中暂停视频录制,gstreamer,recording,Gstreamer,Recording,我创建了一个管道,如下所示: v4l2src -> tee -> queue -> encoder -> avimux -> filesink tee -> queue -> v4l2sink 现在我想暂停录制(保留环回,但暂停编码器),当我恢复时,我希望录制文件从我恢复的地方继续。 我尝试使用gst\u元素\u集合\u状态: 如果暂停管道,环回将停止。 如果暂停编码器,gst_元素_set_状态的返回值是ok的,但编码器不会真正

我创建了一个管道,如下所示:

v4l2src -> tee -> queue -> encoder -> avimux -> filesink
           tee -> queue -> v4l2sink
现在我想暂停录制(保留环回,但暂停编码器),当我恢复时,我希望录制文件从我恢复的地方继续。 我尝试使用gst\u元素\u集合\u状态: 如果暂停管道,环回将停止。 如果暂停编码器,gst_元素_set_状态的返回值是ok的,但编码器不会真正暂停。 我暂停了avimux,编码器也是如此。
有人能帮忙吗?非常感谢。

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

这有帮助吗?