web-dev-qa-db-fra.com

Capture du flux h.264 depuis la caméra avec Gstreamer

J'essaie de capturer le flux H264 d'une caméra Logitech C920 installée localement à partir de /dev/video0 avec l'élément Gstreamer 1.0v4l2src.

v4l2-ctl --list-formats indique que la caméra est capable de donner le format vidéo H264:

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

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

        ...

Mais pipeline 

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

continue à me donner l'erreur 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.

De l'aide!

10
s.webbandit

Gstreamer est-il obligatoire pour vos besoins? J'ai également beaucoup de problèmes avec le Logitech C920 en mode H264 et gstreamer. Mais j’ai réussi à utiliser VLC comme serveur RTSP pour utiliser le C920 avec H264:

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

Ensuite, je peux me connecter avec un autre VLC à l'URI rtsp: // localhost: 8554/live

Si GStreamer est obligatoire pour vous, je n'ai réussi à l'utiliser qu'avec un utilitaire de capture que vous pouvez trouver ici: https://github.com/csete/bonecam - répertoire "capture"

Vous devez le compiler, mais si vous avez des compétences en programmation, cela devrait être très facile car il n’ya qu’un fichier C et un script pour vous aider. Il suffit de passer "Host" en tant que paramètre du script:

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

Vous pouvez utiliser l'utilitaire "capture" avec quelque chose comme ça:

$ 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

Si vous n'aimez pas spécifier le nombre de trames à obtenir (paramètre "-c" avec "capture"), cet utilitaire se trouve sous un fork que vous pouvez trouver ici: https://github.com/DeLaGuardo/ bonecam

Je sais qu’il existe un plugin qualifié de "mauvais", appelé uvch264 pour gstreamer 0.10, qui devrait fonctionner avec le C920. Mais je ne sais pas pour gstreamer 1.0, et je n’ai pas pu le tester.

UPD:

N'oubliez pas d'ajouter --rtsp-timeout=-1 à la ligne de commande cvlc comme 

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

Sans cette option, la diffusion en continu ne dure que 60 secondes par défaut.

9

J'ai essayé de faire la même chose et j'ai eu la même erreur. Je crois que j'utilisais GStreamer 1.0.6.

Ce que j'ai trouvé, peut-être même grâce à la réponse de Fergal Butler, était la page suivante:

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

Youness Alaoui décrit ici l’élément uvch264_src qu’il a créé pour apporter le support de caméra H264 à GStreamer.

Il décrit le portage de GStreamer 1.0 comme étant en attente dans son article. Donc, au cours de la semaine dernière, j'ai étudié cette question. Il s'avère que a a maintenant été porté vers GStreamer 1.0, mais uniquement dans une version pour développeur (version 1.1.2).

Vous pouvez obtenir la version 1.1.2 ici:

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

Il s'appelle maintenant "uvch264src" et fait partie de gst-plugins-bad. Je pense que cela est également présent dans la version 1.1.1 mais je n’ai pas vraiment étudié la question.

J'ai eu un peu de difficulté à l'installer, je pense en grande partie à cause de conflits avec les packages GST 1.0 installés sur mon PC (donc ma propre faute). Mais notez qu'il a des dépendances sur libgudev-1.0-dev et libusb-1.0-0-dev, installez donc ces paquets en premier. Il m'a fallu un certain temps pour comprendre que c’était ces deux-là qui me manquaient.

Voici un pipeline que je dois travailler et qui utilise 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

Si vous ne souhaitez pas utiliser la vidéo d'aperçu (à partir du pad vfsrc), connectez simplement src.vfsrc à un faux lien. Je devrais également mentionner que même si ce pipeline fonctionne pour moi, je reçois de nombreux avertissements au sujet du "Flux de données obtenu avant l'événement de segment". Alors évidemment, je ne fais pas quelque chose de bien, mais je ne sais pas quoi.

Quoi qu’il en soit, après avoir eu tant de mal à faire en sorte que 1.1.2 et uvch264src soient complètement installés et fonctionnent, j’ai décidé de tenter à nouveau la version v4l2src. Et il s'avère que v4l2src supporte correctement H264 après tout: /. (Voir la réponse courte.)


Réponse courte:

La réponse courte à votre question est donc que si vous êtes prêt à installer la version 1.1.2 à partir des sources, vous serez capable de faire exactement ce que vous voulez de la même manière que vous avez essayé de le faire. Vous ne devriez pas avoir besoin de uvch264src. J'ai testé votre pipeline et cela a bien fonctionné avec mon installation. J'ai également essayé ce simple pipeline, pour afficher la vidéo à l'écran, et cela a également bien fonctionné pour moi:

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

J'ai également une caméra Logitech C920 et j'ai utilisé le pipeline suivant pour enregistrer une vidéo H.264 à partir de la caméra:

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

Cela demande à la caméra de produire des données H.264, que je muxures ensuite dans un flux de transport MPEG container et que je copie sur disque. Je peux jouer le fichier résultant avec succès avec Totem.

Le pipeline ci-dessus enregistre à 720p. La caméra peut également enregistrer en 1080p si vous modifiez le format demandé en width=1920,height=1080.

0
James Henstridge

Essayez d'utiliser vidéoconvertir pour convertir automatiquement la vidéo en un format compris par le récepteur vidéo.

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