2013-04-03 46 views
9

Sto provando a catturare lo stream H264 dalla videocamera Logitech C920 installata localmente da /dev/video0 con l'elemento Gstreamer 1.0v4l2src.Catturare stream h.264 dalla fotocamera con Gstreamer

v4l2-ctl --list-formats mostra che fotocamera è in grado di dare H264 formato video:

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

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

     ... 

Ma gasdotto

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

continua a darmi not-negotiated (-4) errore:

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

Qualsiasi aiuto!

risposta

9

È GStreamer obbligatoria per le vostre esigenze? Ho anche molti problemi con Logitech C920 in modalità H264 e gstreamer. Ma sono riuscito a utilizzare VLC come server RTSP per utilizzare il C920 con H264:

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

Poi mi può collegarsi con un altro VLC alla rtsp URI: // localhost: 8554/live

Se GStreamer è obbligatorio per te, sono riuscito a utilizzarlo solo con un'utilità di acquisizione che puoi trovare qui: https://github.com/csete/bonecam - directory "capture"

Devi compilarlo, ma se hai alcune capacità di programmazione è molto semplice è solo un file C e uno script per aiutare. Basta passare "host" come parametro allo script:

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

È possibile utilizzare l'utilità di "cattura" con qualcosa di simile:

$ 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 

Se non ti piace per specificare il numero di telaio per ottenere ("-c" parametro con "capture"), c'è un fork per questa utility che puoi trovare qui: https://github.com/DeLaGuardo/bonecam

So che esiste un plugin classificato come "cattivo", chiamato uvch264 per gstreamer 0.10, dovrebbe funzionare con il C920. Ma non lo so per gstreamer 1.0, e non ho potuto testarlo.

UPD:

Non dimenticare di aggiungere --rtsp-timeout=-1-cvlc linea di comando come

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

Senza questa opzione di streaming dura solo per 60 secondi per impostazione predefinita.

+0

Grazie mille! 'cvlc' funziona come un incantesimo! Lo sto usando su Rasperry Pi. –

+0

Con il C920 in modalità H264? Sei sicuro? Ho avuto molti problemi ad abilitare la modalità H264 della fotocamera con il Raspberry Pi, a causa di problemi USB sul Raspberry Pi. Alcuni fotogrammi H264 sono persi a causa di questo problema, quindi il video è strano. In realtà, a causa di ciò, sto usando il C920 su un Beaglebone. Ad ogni modo, se funziona per voi suppongo che ci fosse un aggiornamento nel firmware per risolvere questo problema. –

+0

Ho avuto questo problema con USB prima di abbandonare i frame. Ho installato il nuovo kernel Rapbian come descritto qui (https://github.com/raspberrypi/linux/issues/238). Il problema del drop frame è scomparso. Ora lo streaming di video H264 è molto fluido. –

1

Ho cercato di fare la stessa cosa e ho avuto lo stesso errore. Credo che stavo usando GStreamer 1.0.6.

Quello che ho trovato, forse anche grazie alla risposta di Fergal Butler, è stata la seguente pagina:

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

Qui Youness Alaoui descrive l'elemento uvch264_src ha fatto per portare il sostegno della macchina fotografica H264 di GStreamer.

Descrive la porta su GStreamer 1.0 come in sospeso nel suo articolo. Così nell'ultima settimana ho esaminato questo. Si scopre che è ha ora è stato portato su GStreamer 1.0, ma solo in una versione per sviluppatori (Versione 1.1.2).

È possibile ottenere la versione 1.1.2 qui:

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

Si chiama "uvch264src" ora, ed è una parte di GST-plugins-bad. Penso che sia presente anche nella versione 1.1.1, ma non l'ho davvero studiato.

Ho avuto un po 'di difficoltà a installarlo, penso soprattutto a causa di conflitti con i pacchetti GST 1.0 installati sul mio PC (quindi colpa mia). Notate che ha dipendenze su libgudev-1.0-dev e libusb-1.0-0-dev, quindi installate prima questi pacchetti - mi ci è voluto un po 'per capire che quei due mi mancavano.

Ecco una pipeline ho avuto modo di lavorare che utilizza 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

Se non si desidera utilizzare il video di anteprima (dal pad vfsrc) basta collegare src.vfsrc dritto fino a un falso Devo anche menzionare che anche se questa pipeline funziona per me, ricevo molti avvertimenti su "Got data flow before event segment". Quindi ovviamente non sto facendo qualcosa di giusto, ma non sono sicuro di cosa.

In ogni caso, dopo tutto quello che riguarda il fatto di avere 1.1.2 e uvch264src completamente installati e funzionanti, ho deciso di dare a v4l2src un rapido ritorno. E si scopre che v4l2src supporta correttamente l'H264 dopo tutto: /. (Si veda la risposta breve.)


Risposta breve:

Quindi la risposta breve alla tua domanda è che se sei felice di installare 1.1.2 dai sorgenti sarete in grado di fare esattamente quello che vuoi nello stesso modo in cui hai provato a farlo. Non dovresti aver bisogno di uvch264src. Ho testato la tua pipeline e ha funzionato bene con la mia installazione. Ho anche provato questo semplice gasdotto, per visualizzare il video sullo schermo, e ha funzionato bene anche per me:

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

Prova Usa videoconvert per convertire automaticamente il video in un formato comprensibile per il video affondare

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

ho anche una telecamera Logitech C920, e hanno utilizzato il seguente gasdotto di registrare video H.264 dalla fotocamera:

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

Questo richiede alla fotocamera di produrre dati H.264, che poi musso in un contenitore MPEG transport stream e scrivere sul disco. Posso riprodurre correttamente il file risultante con Totem.

La pipeline di cui sopra registra a 720p. La videocamera può anche registrare a 1080p se si modifica il formato richiesto su width=1920,height=1080.