Приостановка нити gstreamer, сделанной с тройником

У меня есть конвейер gstreamer, который берет видео с веб-камеры и разделяет его на два потока:
1) используйте приложение, чтобы я мог программно редактировать захваченные кадры;
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 ++.

Моя проблема в том, что в большинстве случаев мне нужны не два потока, работающие одновременно, а только один из них. А в редких случаях - нужно и то, и другое.
Поэтому мне нужен способ временно приостановить / остановить либо приложение, либо сохранение видео - чтобы сэкономить процессор.

Я делаю это сейчас: уничтожаю конвейер и воссоздаю его снова только с одним потоком, когда это необходимо, но это кажется довольно уродливым.

Я искал лучшее решение, но пока не повезло - есть ли способ сделать это?

Заранее спасибо!


person Tomov    schedule 14.08.2015    source источник


Ответы (1)


Более простой способ приблизиться к этому может заключаться в использовании элемента valve. У него есть свойство drop, которое можно установить в значение true или false. Ставим сразу после очереди на тройник.

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

РЕДАКТИРОВАТЬ: это не работает. Более подробная информация представлена ​​в этом сообщении в списке рассылки GStreamer:

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

person mpr    schedule 14.08.2015
comment
Выглядит очень многообещающе, но когда ставлю! клапан drop = TRUE после одной из очередей кажется, что останавливает и другую очередь ... - person Tomov; 14.08.2015
comment
Ах хм, ты прав. Я отменяю свое предложение. Хотя identity drop-probability=0.99 вроде почти работает. Очень странный. - person mpr; 14.08.2015
comment
На самом деле этот поток говорит, что он сломается, только если во время выполнения установлено drop = true. Я предполагаю, что можно изначально установить для него значение false, затем запустить два потока в течение некоторого времени, а затем динамически установить для некоторых из них drop = true. Я попробую завтра, спасибо! - person Tomov; 14.08.2015
comment
На самом деле этот поток говорит, что он сломается, только если во время выполнения установлено drop = true. Вероятно, вы не об этом хотели написать. Поток говорит обратное, он сломается, только если drop = true установлено во время компиляции. - person Étienne; 19.08.2019