Dépendances d'éléments GStreamer: Comment connecter playbin à hlssink?

1

Je suis nouveau dans GStreamer et j’essaie de créer des pipelines simples avec gst-launch-1.0. J'ai du mal à comprendre quels éléments doivent être combinés. Par exemple, je souhaite diffuser une vidéo WebM sur une balise vidéo HTML5 dans un navigateur. Pour ouvrir et lire le fichier, je pense que je dois utiliser playbin:

gst-launch-1.0 playbin uri=file:///home/ubuntu/g-streamer-lively/skyrim.webm ...

Ensuite, pour rendre le fichier disponible, j'utilise hlssink:

! hlssink max-files=5  playlist-root=http://10.12.9.3/ location=/var/www/html/hlssink.webm

Ensuite, dans mon navigateur, j'utilise le tag vidéo:

<video src="http://10.12.9.3/hlssink.webm" controls>

Donc, ce pipeline ne démarre pas et j'obtiens l'erreur suivante:

WARNING: erroneous pipeline: could not link playbin0 to hlssink0

Donc, cela me dit que je ne peux pas lier ces deux éléments. Très bien, mais où puis-je chercher quels autres éléments je dois inclure dans mon pipeline pour que cela fonctionne?

Merci d'avance.

Przemek Lach
la source

Réponses:

0

Je suppose que vous devriez vous arrêter un peu et lire un peu la documentation de gstreamer pour comprendre son fonctionnement. GStreamer est un framework permettant de construire un graphique pour le traitement de données. Vous pouvez trouver le manuel ici: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html

Playbin est un élément spécial (une corbeille) et constitue un pipeline interne pour vous. Playbin n'exposera aucun pavé de liaison car il est conçu pour créer un pipeline de lecture complète. C'est pourquoi vous ne pouvez pas le lier à hlssink.

Vous pouvez utiliser d'autres éléments pour créer un pipeline afin de transcoder votre entrée Webm en hlssink. Par exemple, vous pouvez utiliser uridecodebin, un autre bac qui créera automatiquement un pipeline de décodage pour tout support utilisé (à condition que vous disposiez des plug-ins appropriés). ) Quelque chose comme:

gst-launch-1.0 uridecodebin uri=<youruri> name=decbin ! queue ! videoconvert ! x264enc ! tsmux name=muxer ! hlssink decbin. ! queue ! audioconvert ! faac ! muxer.

Je ne l'ai pas testé, mais quelque chose comme ça devrait fonctionner pour convertir votre entrée en MPEG en utilisant H264 et AAC, par exemple, et transmettre les données pour hlssink.

Utilisez l'outil gst-inspect-1.0 pour vérifier quels éléments vous avez sur votre système. Il listera tous les éléments si vous ne lui donnez pas d'argument ou si vous lui en donnez plus de détails, comme:

gst-inspect-1.0 hlsssink

EDIT: réparer le pipeline que vous avez proposé dans les commentaires

gst-launch-1.0 uridecodebin uri=file:///home/ubuntu/g-streamer-lively/skyrim.webm name=decbin ! queue ! videoconvert ! x264enc ! mpegtsmux name=muxer ! hlssink max-files=5 playlist-root=10.12.9.3 location=/var/www/html/hlssink decbin. ! queue ! audioconvert ! avenc_aac ! muxer.
thiagoss
la source
J'ai donc déjà lu la documentation, mais j'ai toujours du mal à comprendre l'ordre des éléments. C'est peut-être parce que je n'ai pas de formation en montage vidéo / audio, alors je ne comprends pas vraiment le processus. Si je veux simplement diffuser un fichier .webm, pourquoi dois-je faire des choses comme vidéoconvertir, x264enc, etc. Je peux servir le fichier .webm directement sur mon navigateur via apache, pourquoi dois-je utiliser ces éléments supplémentaires de gstreamer pour se déplacer simplement le fichier par un simple pipeline?
Przemek Lach
J'ai essayé d'utiliser votre pipeline et j'ai dû changer quelques éléments: gst-launch-1.0 uridecodebin uri = fichier: ///home/ubuntu/g-streamer-lively/skyrim.webm name = decbin! faire la queue! vidéoconvertir! x264enc! mpegtsmux name = muxer! hlssink decbin. ! faire la queue! audioconvert! avenc_aac! muxer. ! hlssink max-files = 5 playlist-root = 10.12.9.3 location = / var / www / html / hlssink.webm. Maintenant, lorsque j'essaie de démarrer, j'obtiens l'erreur suivante: AVERTISSEMENT: pipeline erroné: lien sans élément source.
Przemek Lach
vous ne "déplacez" pas un fichier dans le pipeline, il sera traité à chaque nœud. Lorsque vous utilisez uridecodebin, il démultipliera et décodera votre fichier d’entrée. En supposant que vous ayez à la fois de la vidéo et de l’audio, vous obtiendrez 2 sorties. Chacun est réencodé avec un nouveau format pour être multiplexé en mpegts, ce qui correspond généralement à ce qui est servi via le protocole HLS que vous souhaitez utiliser.
Thiagoss
Votre pipeline est erroné, deux instances de hlssink ont ​​été créées et je ne suis pas sûr que vous compreniez ce qu'est HLS et comment cela fonctionne grâce aux paramètres que vous avez sélectionnés. HLS créera une liste de lecture de petits fichiers à télécharger et à lire séquentiellement.
Thiagoss
Bonjour, merci pour l'édition. J'ai essayé votre nouveau pipeline et j'obtiens le message d'erreur suivant: ERREUR: de element / GstPipeline: pipeline0 / avenc_aac: avenc_aac0: le codec est expérimental, mais les paramètres ne permettent pas aux codeurs de produire une sortie de qualité expérimentale. J'ai essayé de déterminer où je pouvais définir la «qualité expérimentale», mais je n'ai pas réussi à la trouver. Est-ce que je manque un drapeau ou quelque chose?
Przemek Lach