暂停用 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。把它放在发球台队列的后面。
编辑:这不起作用。 GStreamer 邮件列表中的 post 中提供了更多详细信息:
我有一个 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。把它放在发球台队列的后面。
编辑:这不起作用。 GStreamer 邮件列表中的 post 中提供了更多详细信息: