it-swarm.com.de

H.264-Stream von der Kamera mit Gstreamer aufnehmen

Ich versuche, den H264-Stream von der lokal installierten Logitech C920-Kamera von /dev/video0 mit Gstreamer 1.0v4l2src-Element zu erfassen.

v4l2-ctl --list-formats zeigt, dass die Kamera das H264-Videoformat bereitstellen kann:

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

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

        ...

Aber Pipeline 

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

gibt mir not-negotiated (-4) Fehler:

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

Irgendeine Hilfe!

10
s.webbandit

Ist gstreamer für Ihre Bedürfnisse obligatorisch? Ich habe auch viele Probleme mit dem Logitech C920 im H264-Modus und mit Gstreamer. Es gelang mir jedoch, VLC als RTSP-Server für die Verwendung des C920 mit H264 zu verwenden:

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

Dann kann ich mich mit einem anderen VLC an die URI rtsp: // localhost: 8554/live anschließen

Wenn GStreamer für Sie obligatorisch ist, habe ich es nur mit einem Capture-Dienstprogramm verwendet, das Sie hier finden können: https://github.com/csete/bonecam - directory "capture"

Sie müssen es kompilieren, aber wenn Sie über Programmierkenntnisse verfügen, sollte es sehr einfach sein, da es nur eine C-Datei und ein Skript gibt, die helfen können. Übergeben Sie einfach "Host" als Parameter an das Skript:

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

Sie können das "Capture" -Programm mit so etwas verwenden:

$ 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

Wenn Sie nicht die Anzahl der abzurufenden Frames angeben möchten (Parameter "-c" mit "capture"), gibt es eine Verzweigung zu diesem Dienstprogramm, die Sie hier finden können: https://github.com/DeLaGuardo/ Bonecam

Ich weiß, dass es ein Plugin gibt, das als "schlecht" kategorisiert wird und als uvch264 für gstreamer 0.10 bezeichnet wird, das mit dem C920 funktionieren sollte. Aber ich weiß es nicht für gstreamer 1.0, und ich konnte es nicht testen.

UPD:

Vergessen Sie nicht, --rtsp-timeout=-1 zur cvlc Befehlszeile hinzuzufügen 

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

Ohne diese Option dauert das Streaming standardmäßig nur 60 Sekunden.

9

Ich habe versucht, dasselbe zu tun, und ich habe den gleichen Fehler erhalten. Ich glaube, ich habe GStreamer 1.0.6 verwendet.

Was ich gefunden habe, möglicherweise sogar dank der Antwort von Fergal Butler, war die folgende Seite:

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

Hier beschreibt Youness Alaoui das Element uvch264_src, das er für die Unterstützung der H264-Kamera für GStreamer entwickelt hat.

In seinem Artikel beschreibt er die Portierung von GStreamer 1.0 als anhängig. Also habe ich mich in der letzten Woche damit beschäftigt. Es stellt sich heraus, dass hat jetzt auf GStreamer 1.0 portiert wurde, jedoch nur in einer Entwicklerversion (Version 1.1.2).

Version 1.1.2 können Sie hier herunterladen:

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

Es heißt jetzt "uvch264src" und ist Teil von gst-plugins-bad. Ich denke, es ist auch in Version 1.1.1 vorhanden, aber ich habe das nicht wirklich untersucht.

Es fiel mir etwas schwer, es zu installieren, ich glaube meistens aufgrund von Konflikten mit auf meinem PC installierten GST 1.0-Paketen (also meine eigene Schuld). Beachten Sie jedoch, dass es Abhängigkeiten von libgudev-1.0-dev und libusb-1.0-0-dev gibt, also installieren Sie diese Pakete zuerst. Es dauerte eine Weile, bis ich herausfand, dass es diese beiden waren, die mir fehlten.

Hier ist eine Pipeline, an der ich arbeite, die uvch264 verwendet:

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

Wenn Sie das Vorschau-Video (vom vfsrc-Pad) nicht verwenden möchten, haken Sie src.vfsrc einfach direkt an einen Fakesink an. Ich sollte auch erwähnen, dass, obwohl diese Pipeline für mich funktioniert, ich eine Menge Warnungen über "Datenfluss vor Segmentereignis" erhalten habe. Natürlich mache ich nichts richtig, aber ich weiß nicht was.

Nach all dem Durcheinander über 1.1.2 und die vollständige Installation von uvch264src und seine Arbeitsweise entschied ich mich, v4l2src wieder einen schnellen Schritt zu geben. Und es stellt sich heraus, dass v4l2src schließlich H264 richtig unterstützt: /. (Siehe die kurze Antwort.)


Kurze Antwort:

Die kurze Antwort auf Ihre Frage lautet also: Wenn Sie 1.1.2 glücklich von Source installieren, können Sie genau das tun, was Sie möchten, genauso wie Sie es versucht haben. Sie sollten uvch264src nicht benötigen. Ich habe Ihre Pipeline getestet und es hat gut mit meiner Installation funktioniert. Ich habe auch diese einfache Pipeline ausprobiert, um das Video auf dem Bildschirm anzuzeigen, und es funktionierte auch für mich:

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

2
Adam Goodwin

Ich habe auch eine Logitech C920-Kamera und habe die folgende Pipeline verwendet, um H.264-Videos von der Kamera aufzunehmen:

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

Dadurch wird die Kamera aufgefordert, H.264-Daten zu erzeugen, die ich dann in einen MPEG-Transportstream Container muxiere und auf die Festplatte schreibe. Ich kann die resultierende Datei erfolgreich mit Totem abspielen.

Die obige Pipeline wird bei 720p aufgezeichnet. Die Kamera kann auch mit 1080p aufnehmen, wenn Sie das angeforderte Format in width=1920,height=1080 ändern.

0

Verwenden Sie videoconvert, um das Video automatisch in ein Format umzuwandeln, das von der Videosenke verstanden wird

gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! videoconvert ! ...
0
Vadim Suboch
0
Fergal Butler