Захват 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
.