Захват h.264 поток от камеры с Gstreamer

Я пытаюсь захватить поток H264 из локально установленной камеры Logitech C920 из /dev/video0 С Gstreamer 1.0 v4l2src элемент.

v4l2-ctl --list-formats показывает, что камера способна дать формат видео H264:

# v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
        ...

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'H264' (compressed)
        Name        : H.264

        ...

а трубопровод

# gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! video/x-h264, width=800, height=448, framerate=30/1 ! fakesink

продолжает давать мне not-negotiated (-4) ошибка:

/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data flow error.
Additional debug info:
gstbasesrc.c(2809): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
streaming task paused, reason not-negotiated (-4)
Execution ended after 67687169 ns.

любая помощь!

5 ответов


является ли gstreamer обязательным для ваших нужд? У меня также много проблем с Logitech C920 в режиме H264 и gstreamer. Но мне удалось использовать VLC в качестве RTSP-сервера для использования C920 с H264:

$ cvlc -v v4l2:///dev/video0:chroma="H264":width=1024:height=570:fps=30 \
       --sout="#rtp{sdp=rtsp://:8554/live}"

затем я могу подключиться с другим VLC к URI rtsp: / / localhost: 8554/live

если GStreamer является обязательным для вас, мне удалось использовать его только с утилитой захвата, которую вы можете найти здесь:https://github.com/csete/bonecam - справочник "захват"

вы должны скомпилировать его, но если у вас есть некоторые навыки программирования, это должно быть очень легко, поскольку есть только один файл с и скрипт для. Просто передайте" host " в качестве параметра скрипту :

# Get the bonecam/capture content or git clone the directory, and then
$ cd bonecam/capture
$ ./build host

вы можете использовать утилиту "захват" с чем-то вроде этого :

$ v4l2-ctl -d /dev/video0 --set-fmt-video=width=1024,height=570,pixelformat=1
$ v4l2-ctl -d /dev/video0 --set-parm=30
$ ./bonecam/capture/capture -d /dev/video0 -c 100000 -o | \
      gst-launch -e filesrc location=/dev/fd/0 ! legacyh264parse ! rtph264pay ! udpsink host=10.0.0.42 port=5000

Если вам не нравится указывать количество кадров для получения (параметр "- c " с "захватом"), есть вилка для этой утилиты, которую вы можете найти здесь: https://github.com/DeLaGuardo/bonecam

Я знаю, что есть плагин, классифицированный как" плохой", называемый uvch264 для gstreamer 0.10, который должен работать с C920. Но я не знаю для GStreamer 1.0, и я не мог проверить его.

UPD:

не забудьте добавить --rtsp-timeout=-1 до cvlc командная строка типа

$ cvlc -v v4l2:///dev/video0:chroma="H264":width=1024:height=570:fps=30 \
       --sout="#rtp{sdp=rtsp://:8554/live}" --rtsp-timeout=-1

без этой опции потоковая передача длится по умолчанию только 60 секунд.


Я пытаюсь сделать то же самое и я получил ту же ошибку. Я считаю, что использовал GStreamer 1.0.6.

http://kakaroto.homelinux.net/2012/09/uvc-h264-encoding-cameras-support-in-gstreamer/

здесь Youness Alaoui описывает элемент uvch264_src, который он сделал, чтобы принести поддержку камеры H264 в GStreamer.

Он описывает порт для GStreamer 1.0, как ожидается в его статье. Так что за последнюю неделю я этим занимался. Оказывается, это и теперь портирован на GStreamer 1.0, но только в выпуске разработчика (версия 1.1.2).

Вы можете получить версию 1.1.2 здесь:

http://gstreamer.freedesktop.org/src/

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

мне было немного трудно установить его, я думаю, в основном из-за конфликтов с пакетами GST 1.0, установленными на моем компьютере (так что моя собственная вина). Но обратите внимание, что он имеет зависимости от libgudev-1.0-dev и libusb-1.0-0-dev поэтому сначала установите эти пакеты - мне потребовалось некоторое время, чтобы понять, что это были те два, которых мне не хватало.

вот трубопровод, который я должен работать, который использует uvch264:

gst-launch-1.0 uvch264src device=/dev/video0 name=src auto-start=true src.vfsrc ! video/x-raw, format=YUY2, width=160, height=90, framerate=5/1 ! xvimagesink src.vidsrc ! queue ! video/x-h264, width=800, height=448, framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink

Если вы не хотите использовать предварительный просмотр видео (от пусковой площадки vfsrc) как раз крюк src.vfsrc прямо до fakesink. Я также должен упомянуть, что, хотя этот конвейер работает для меня, я получаю много предупреждений о "Got data flow before segment event". Очевидно, я делаю что-то не так, но не знаю, что именно.

во всяком случае, после всего этого беспорядка о том, что 1.1.2 и uvch264src полностью установлены и работают, я решил дать v4l2src быстрый ход снова. И оказывается, что v4l2src поддерживает H264 правильно в конце концов./: (См. краткий ответ.)


Короткий Ответ:

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

gst-launch-1.0 -e v4l2src device=/dev/video0 ! video/x-h264, width=800, height=448, framerate=30/1 ! avdec_h264 ! xvimagesink sync=false


Я не верю, что v4l2src поддерживает h264 на данный момент. Смотрите здесь:

http://www.oz9aec.net/index.php/gstreamer/473-using-the-logitech-c920-webcam-with-gstreamer

и здесь:

http://kakaroto.homelinux.net/2012/09/uvc-h264-encoding-cameras-support-in-gstreamer/


попробовать использовать videoconvert для автоматического преобразования видео в формат, понятный видео-раковина

gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! videoconvert ! ...

у меня также есть камера Logitech C920, и я использовал следующий конвейер для записи видео H. 264 с камеры:

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-h264,width=1280,height=720,framerate=30/1 ! mpegtsmux ! filesink location=output.ts

Это просит камеру произвести данные H. 264, которые я затем mux в транспортный поток MPEG контейнер и запись на диск. Я могу успешно воспроизвести полученный файл с помощью Totem.

вышеуказанные записи трубопровода на 720p. Камера также может записывать в 1080p, если вы измените запрошенный формат на width=1920,height=1080.