2016-05-24 5 views
0

Bonjour,GStreamer: écrire les flux vidéo et Audo en un seul conteneur MP4 après concat

J'ai deux fichiers mp4 (de a.mp4 et b.mp4), chacun d'eux comprend les flux vidéo et audio, et J'ai besoin de les concaténer dans un seul conteneur mp4 (c.mp4) en utilisant gstreamer (cette question est connectée à the previous one)

En d'autres termes, le pipeline suivant concatène le contenu de a.mp4 et b.mp4, puis les sorties le résultat en autovideosink et alsasink:

GST_DEBUG=3 gst-launch-1.0 concat name=c2 ! videoconvert ! videorate ! autovideosink concat name=c ! audioconvert ! audiorate ! alsasink filesrc location=a.mp4 ! decodebin name=d1 ! audio/x-raw ! queue ! c. filesrc location=b.mp4 ! decodebin name=d2 ! audio/x-raw ! queue ! c. d1. ! video/x-raw ! queue ! c2. d2. ! video/x-raw ! queue ! c2. 

Fonctionne comme un charme! Mais au lieu de autovideosink et alsasink, j'ai besoin de ré-encoder, puis mux concaténés flux vidéo et audio et les écrire dans un seul conteneur (ie il devrait y avoir un seul "emplacement de fichiers = c.mp4" si je comprends bien correctement) - de cette façon je recevrais le contenu de a.mp4 ajouté avec le contenu de b.mp4 (a.mp4 + b.mp4 = c.mp4)

Quelqu'un pourrait s'il vous plaît partager un pipeline qui montre comment faire ce ?

Répondre

1

Ok au moins vous avez mentionné filesink .. mais vous devriez toujours poster quelque chose que vous avez (un morceau de tuyau qui ne travaillent pas encore ..) est de toute façon ici le tuyau magique:

gst-launch-1.0 -e concat name=c2 ! videoconvert ! x264enc tune=4 ! mp4mux name=mp4 ! filesink location=out.mp4 concat name=c ! audioconvert ! voaacenc ! mp4. filesrc location=big.mp4 ! decodebin name=d1 ! audio/x-raw ! queue ! c. filesrc location=big2.mp4 ! decodebin name=d2 ! audio/x-raw ! queue ! c. d1. ! video/x-raw ! queue ! c2. d2. ! video/x-raw ! queue ! c2. 

BTW vous pouvez lire quelque chose gst-launch

S'il vous plaît notez quelques petites choses:

1, il y a commutateur -e pour gst-launch qui fait envoyer EOS à la conduite qui se termine le processus de mp4muxing correctement .. sinon les métadonnées ne sera pas écrit

2, Le tuyau ne se termine pas automatiquement .. c'est quelque chose que vous pouvez régler ... peut-être un attribut pour concat ou quelque chose .. Peut-être essayer d'ajouter streamsynchronizer - mais je n'ai pas réussi avec celui-là. Je ne suis pas sûr si je dois mettre après concat ou avant .. peut-être vous pouvez demander sur IRC

3, Comment puis-je construire un tel tuyau? A, d'abord j'ai vérifié les capacités de mp4mux comme je savais que je veux mux mp4 .. (pour trouver ceci vous pouvez taper gst-inspect-1.0 | grep mp4 | grep mux si vous êtes sur Linux). Vous devez vous rappeler que src is the output de l'élément et le puits est l'entrée (parfois ce n'est pas très naturel de penser de cette façon .. souvenez-vous de l'évier est cette chose où l'eau finit quand vous lavez vos mains: D). Nous nous attendons donc à ce qu'il y ait un puits pour l'audio et un puits pour la vidéo ..

B, Il y a peu de possibilités pour l'audio J'ai choisi l'audio/mpeg ... alors je me souviens que mp4 utilise aac parfois .. alors j'ai cherché aac codeur qui est voaacenc .. J'ai vérifié les caps src et en effet son audio/mpeg (version 4)

C, Pour la vidéo il y a vidéo/x-h264 que j'aime le plus .. donc j'ai pris bon vieux x264enc que je utiliser tout le temps pour la vidéo .. Je pensais que peut-être j'ai besoin d'avoir h264parse mais ce n'est pas nécessaire ..

4, Ensuite, tout regrouper ..Rappelez-vous que vous pouvez donner des éléments noms d'une manière d'utiliser name=something (son exactement comme alias), mais vous ne pas seulement l'utiliser comme something mais vous devez pu point plus tard si son something.

5, rappelez-vous aussi que dans ce ordonnez que vous mettiez des éléments dans gst-launch est plus à propos de la liaison que du traitement. Pensez-y que tout ce dont vous avez besoin est de lier les éléments ... et alors pensez au traitement lui-même. Vous pouvez mettre des éléments * sink au début du pipeline mais vous devez ensuite leur donner nom et utiliser ce nom ailleurs (par exemple après mux comme je l'ai fait)

6, Pour simplifier le traitement des entrées puis décodeur qui se reproduit deux branches - audio et vidéo .. chaque type va à concat .. il y a deux concaves - chacun a son propre type de traitement (pour la vidéo il y a videoconvert etc ..) alors ces deux branches de concat passe par l'encodage et après l'encodage fin à mp4mux .. après mux il y a juste filesink .. c'est tout

+0

Awesome! J'ai dû construire aussi bien "gst-plugins-bad" et gst-plugins-laid "(ne les a pas construits auparavant à cause de leurs noms effrayants) pour activer x264enc et voaacenc .. et le tour est joué! Appréciez aussi votre explication détaillée, il est extrêmement utile. –