Почему я могу передавать потоковое видео в кодировке h264 с веб-камеры на ОБАЙ дисплей и в файл, но НЕ в необработанное видео?

Я хочу передавать потоковое видео с веб-камеры Logitech C920 и одновременно отображать и сохранять видео в файл с помощью GStreamer 1.0.

Это работает, если я транслирую видео с кодировкой h264 с камеры (камера обеспечивает аппаратное кодирование h264), но не получается, если я транслирую сырое видео с камеры. Однако, если я только отображаю или только сохраняю в файл, потоковое сырое видео работает.

Почему он работает с видеопотоком h264, а не с необработанным видеопотоком?

Поток видео в кодировке h264 с камеры на ОБА дисплей и файл (РАБОТАЕТ):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-h264,width=640,height=480,framerate=15/1 ! tee name=t \
    t. ! queue ! h264parse ! avdec_h264 ! xvimagesink sync=false \
    t. ! queue ! h264parse ! matroskamux \
    ! filesink location='h264_dual.mkv' sync=false

сырой видеопоток с камеры на ТОЛЬКО дисплей (РАБОТАЕТ):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! xvimagesink sync=false

Необработанный видеопоток с камеры в ТОЛЬКО файл (РАБОТАЕТ):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! videoconvert ! x264enc ! matroskamux \
    ! filesink location='raw_single.mkv' sync=false

сырой видеопоток с камеры на ОБА дисплей и файл (FAILS):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! tee name=t \
    t. ! queue ! xvimagesink sync=false \
    t. ! queue ! videoconvert ! x264enc ! h264parse ! matroskamux \
    ! filesink location='raw_dual.mkv' sync=false

Последняя команда (необработанное видео как для отображения, так и для файла) завершается неудачно без каких-либо предупреждений или ошибок. Вывод терминала gst-launch точно такой же, как и при записи только в файл. Появляется окно xvimage, в котором отображается изображение с камеры, но оно не меняется (т.е. оно заморожено). Также появляется файл с нулевым байтом.

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

Кто-нибудь понимает, что я делаю не так?

1 ответ

Решение

Можно выполнить потоковую передачу необработанного видео с веб-камеры (не относится к C920) как на дисплей, так и на файл в кодировке h.264. x264enc имущество tune должен быть установлен в zerolatency,

Пример h.264:

gst-launch-1.0 -v v4l2src device=/dev/video0 \ ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \ ! tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! x264enc tune=zerolatency ! h264parse ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

Кроме того, можно полностью пропустить h.264 и вместо этого кодировать в theora или vp8.

пример theora:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! \ video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 ! \ tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! theoraenc ! theoraparse ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

Пример vp8:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! \ video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 ! \ tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! vp8enc ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

Большое спасибо Яну Спурни и Тиму.

Другие вопросы по тегам