2013-04-03 27 views
9

Próbuję przechwycić strumień H264 z zainstalowanej lokalnie kamery Logitech C920 z elementu /dev/video0 z elementem Gstreamer 1.0v4l2src.Przechwytywanie strumienia h.264 z kamery za pomocą Gstreamer

v4l2-ctl --list-formats pokazuje, że kamera jest w stanie dać H264 format wideo:

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

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

     ... 

Ale rurociąg

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

utrzymuje dając mi not-negotiated (-4) błąd:

/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. 

pomoc!

Odpowiedz

9

Czy GStreamer obowiązkowe dla swoich potrzeb? Mam również wiele problemów z Logitech C920 w trybie H264 i gstreamer. Ale udało mi się użyć VLC jako serwer RTSP używać C920 z H264:

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

Wtedy mogę połączyć się z innym VLC do RTSP URI: // localhost: 8554/live

Jeśli GStreamer jest Obowiązkowe dla ciebie, udało mi się go użyć tylko z narzędziem do przechwytywania, które można znaleźć tutaj: https://github.com/csete/bonecam - katalog "przechwytywanie"

Musisz go skompilować, ale jeśli masz jakieś umiejętności programistyczne, będzie to bardzo łatwe, ponieważ jest tylko jeden plik C i skrypt do pomocy. Wystarczy przejść „host” jako parametr skryptu:

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

Można użyć „przechwytywania” Program narzędziowy z czymś takim:

$ 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 

Jeśli nie chcesz określić liczbę ramie dostać („-c” parametr „capture”), znajduje się widelec do tego narzędzia, które można znaleźć tutaj: https://github.com/DeLaGuardo/bonecam

wiem, że jest plugin skategoryzowane jako „zły”, zwany uvch264 dla GStreamer 0.10, to powinno działać z C920. Ale nie wiem dla gstreamer 1.0, i nie mogłem go przetestować.

UPD:

Nie zapomnij dodać --rtsp-timeout=-1 do cvlc linii poleceń jak

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

Bez tej opcji streamingu trwa tylko 60 sekund domyślnie.

+0

Wielkie dzięki! 'cvlc' działa jak urok! Używam go na Rasperry Pi. –

+0

Z C920 w trybie H264? Jesteś pewny? Miałem wiele problemów z włączeniem trybu H264 kamery z Raspberry Pi, z powodu problemów z portem USB w Raspberry Pi. Niektóre klatki H264 są tracone z powodu tego problemu, więc wideo jest dziwne. Właściwie z tego powodu używam C920 na Beaglebone. W każdym razie, jeśli to działa, zakładam, że aktualizacja oprogramowania układowego rozwiązała ten problem. –

+0

Miałem taki problem z USB przed upuszczeniem klatek. Zainstalowałem tutaj nowe jądro Rapbian (https://github.com/raspberrypi/linux/issues/238). Upadek ramki zniknął. Teraz streaming wideo H264 jest bardzo płynny. –

1

Próbowałem zrobić to samo i dostałem ten sam błąd. Uważam, że korzystałem z GStreamer 1.0.6.

Co znalazłem, być może nawet dzięki odpowiedzi Fergal Butlera, była następująca strona:

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

Tutaj Youness Alaoui opisuje element uvch264_src Zrobił przynieść H264 obsługę aparatu do GStreamer.

Opisuje port do GStreamer 1.0 jako oczekujący w swoim artykule. W ciągu ostatniego tygodnia zastanawiałem się nad tym. Okazuje się, że ma teraz został teraz przeniesiony do GStreamer 1.0, ale tylko w wersji dla programistów (wersja 1.1.2).

można dostać wersję 1.1.2 tutaj:

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

To się nazywa "uvch264src" teraz, i to jest część GST-plugins-bad. Myślę, że jest również obecny w wersji 1.1.1, ale tak naprawdę nie przyjrzałem się temu.

Miałem trochę problemów z zainstalowaniem go, myślę, że głównie z powodu konfliktów z pakietami GST 1.0 zainstalowanymi na moim komputerze (tak moja wina). Ale pamiętaj, że ma on zależności od libgudev-1.0-dev i libusb-1.0-0-dev, więc najpierw zainstaluj te pakiety - zajęło mi trochę czasu, aby dojść do wniosku, że to były te dwa, których mi brakowało.

Oto rurociąg mam do pracy, która wykorzystuje 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

Jeśli nie chcesz korzystać z podglądu video (z podkładki vfsrc) po prostu zaczepić src.vfsrc prosto do fałszywy. Powinienem także wspomnieć, że nawet jeśli ten potok działa dla mnie, otrzymuję wiele ostrzeżeń o "Mam przepływ danych przed zdarzeniem w segmencie". Więc oczywiście nie robię czegoś dobrze, ale nie jestem pewien co.

W każdym razie, po tym wszystkim, że zawadzanie o uzyskanie wersji 1.1.2 i uvch264src całkowicie zainstalowałem i działało, postanowiłem ponownie dać v4l2src. I okazuje się, że v4l2src właściwie obsługuje H264: /. (Patrz krótka odpowiedź.)


Krótka odpowiedź:

Więc krótka odpowiedź na to pytanie jest to, że jeśli jesteś zadowolony zainstalować 1.1.2 ze źródeł będziesz w stanie zrobić dokładnie to, co chcesz w taki sam sposób, w jaki próbujesz to zrobić. Nie powinieneś potrzebować uvch264src. Przetestowałem twój rurociąg i wszystko działało dobrze z moją instalacją. Próbowałem również ten prosty rurociągu, aby wyświetlić film na ekranie, i to działało w porządku dla mnie, a także:

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

próbie użycia videoconvert do automatycznego konwertowania wideo do formatu rozumianego przez wideo zlewozmywak

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

mam też kamerę Logitech C920, i wykorzystali następujące rurociąg do nagrywania wideo H.264 z aparatu:

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

To prosi kamerę, by wyprodukowała dane H.264, które następnie miksuję do kontenera MPEG transport stream i zapisuję na dysk. Mogę odtworzyć wynikowy plik pomyślnie z Totemem.

Powyższy przebieg rurociągu wynosi 720p. Aparat może również nagrywać w rozdzielczości 1080p, jeśli zmienisz żądany format na width=1920,height=1080.

Powiązane problemy