2013-04-03 3 views
9

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

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. 

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

ответ

9

Является ли 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 к RTSP URI: // локальный: 8554/живая

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

Вы должны скомпилировать его, но если у вас есть навыки программирования, это будет очень легко, так как там это только один файл C и скрипт. Просто пройти «хозяин» в качестве параметра сценария:

# 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» с помощью «capture»), есть программа fork, которая находится здесь: 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 секунд по умолчанию.

+0

Спасибо большое! 'cvlc' работает как шарм! Я использую его на Rasperry Pi. –

+0

С C920 находится в режиме H264? Ты уверен? У меня было много проблем, связанных с режимом H264 камеры с малиной Pi, из-за проблем с USB на малине Pi. Из-за этой проблемы некоторые кадры H264 теряются, поэтому видео странно. Собственно, из-за этого я использую C920 на Beaglebone. В любом случае, если это сработает для вас, я предполагаю, что в прошивке есть обновление для решения этой проблемы. –

+0

У меня была такая проблема с USB с кадром. Я установил новое ядро ​​для Rapbian как desbribed здесь (https://github.com/raspberrypi/linux/issues/238). Проблема с кадровой рамкой исчезла. Теперь потоковое видео H264 очень плавное. –

0

Я не верю, что 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/

+1

Только представьте, если эта связь ломается один день. Поэтому, пожалуйста, объясните ссылки, которые вы указали. – Freakyuser

+1

h264 теперь поддерживается v4l2src – Ross

1

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

То, что я нашел, возможно, даже благодаря ответу Fergal Батлера, была следующая страница:

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

Здесь Юнесс 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 прямо к фейкинг. Я должен также упомянуть, что даже несмотря на то, что этот конвейер работает для меня, я получаю много предупреждений о «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

0

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

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

у меня также есть камера 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, которые затем меняют в контейнер MPEG transport stream и записывают на диск. Я могу успешно воспроизвести полученный файл с помощью Totem.

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

Смежные вопросы