暂停用 tee 制作的 gstreamer 线程

Pausing a gstreamer thread made with tee

我有一个 gstreamer 管道,它从网络摄像头获取视频并将其分成两个线程:
1) 使用 appsink 这样我就可以以编程方式编辑捕获的帧
2) 将视频保存到文件

管道看起来像这样:

gst-launch-1.0 v4l2src device=/dev/video0 \
! tee name=t ! queue ! videoconvert ! videoscale ! appsink name=sink caps="video/x-raw,format=RGB,width=800,framerate=15/1" t. \
! queue ! video/x-raw,width=800,framerate=15/1 ! jpegenc ! avimux ! filesink location=/tmp/output.avi

我在 C++ 应用程序中使用它。

我的问题是,在大多数情况下,我不需要同时 运行 两个线程,而只需要其中一个。在极少数情况下 - 两者都需要。
所以我需要一些方法来临时 pause/stop appsink 或视频保存 - 为了保存 CPU.

我现在的做法是销毁管道,需要的时候只用一个线程重新创建,但这看起来很丑。

我一直在寻找更好的解决方案,但到目前为止没有成功 - 有什么办法吗?

提前致谢!

更简单的方法可能是使用 valve 元素。它有一个 drop 属性 可以设置为 true 或 false。把它放在发球台队列的后面。

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-valve.html

编辑:这不起作用。 GStreamer 邮件列表中的 post 中提供了更多详细信息:

http://gstreamer-devel.966125.n4.nabble.com/How-to-Stop-start-recording-using-Valve-element-td4661728.html