Почему я могу передавать потоковое видео в кодировке 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
Большое спасибо Яну Спурни и Тиму.