Как приостановить запись видео в gstreamer - PullRequest
2 голосов
/ 23 сентября 2011

Я создал конвейер следующим образом:

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

Теперь я хочу приостановить запись (сохранить зацикливание, но приостановить кодировщик), и когда я возобновлю, я ожидаю, что файл перекодировки продолжится с того места, где я возобновляю,Я попытался использовать gst_element_set_state: если я приостанавливаю конвейер, петля останавливается.Если я остановлю кодировщик, возвращаемое значение gst_element_set_state будет в порядке, но кодировщик на самом деле не делает пауз.Я остановил avimux, то же самое с кодировщиком.Кто-нибудь может помочь?Большое спасибо.

1 Ответ

2 голосов
/ 13 марта 2012

Пожалуйста, посмотрите на camerabin / camerabin2 в gst-plugins-bad. То, что вы хотите сделать, к сожалению, немного сложно. Я объясню. Для начала вам нужно получить src-pad в очереди, установить для него leaky = downstream и заблокировать src-pad. Это приостанавливает видео. Вы также можете использовать элемент клапана после очереди для того же эффекта. Если вам повезет, все в порядке (должно быть в случае с avimux). Для других форматов (mp4mux) вам нужно будет помнить метку времени последнего буфера при паузе (через pad-data-probe), а когда вы получаете первый новый буфер после бездействия, вычтите время паузы из меток времени. В противном случае у вас будет пауза в полученном видео. Это связано с тем, что видеопотоки в контейнерах mp4 могут быть разреженными. Это также влияет на другие форматы. Теоретически вы также должны быть в состоянии справиться с этим, отправив событие нового сегмента в нисходящем направлении после бездействия (до первого буфера), но я этого не пробовал. Еще раз проверьте, как это делается, особенно в camerabin2. Также рассмотрите возможность использования camerabin2:)

...