41 votes

Rejoindre des fichiers mp4 sous linux

Je veux joindre deux fichiers mp4 pour en créer un seul. Les flux vidéo sont encodés en h264 et l'audio en aac. Je ne peux pas ré-encoder les vidéos dans un autre format pour des raisons de calcul. De plus, je ne peux pas utiliser de programmes GUI, tout le traitement doit être effectué avec les utilitaires en ligne de commande Linux. FFmpeg ne peut pas le faire pour les fichiers mpeg4 donc j'ai utilisé MP4Box à la place :

MP4Box -add video1.mp4 -cat video2.mp4 newvideo.mp4

Malheureusement, l'audio est tout mélangé. J'ai pensé que le problème venait de l'audio étant en aac donc je l'ai transcodé en mp3 et j'ai de nouveau utilisé MP4Box. Dans ce cas, l'audio est bon pour la première moitié de newvideo.mp4 (correspondant à video1.mp4) mais ensuite il n'y a pas d'audio et je ne peux pas naviguer dans la vidéo non plus.

Ma prochaine idée était que les flux audio et vidéo avaient de petites différences dans leurs longueurs que je devais corriger. Donc pour chaque vidéo d'entrée j'ai séparé les flux vidéo et audio puis je les ai rejoints avec l'option -shortest dans FFmpeg.

Ainsi, pour la première vidéo j'ai exécuté :

 avconv -y -i video1.mp4 -c copy -map 0:0 videostream1.mp4
 avconv -y -i video1.mp4 -c copy -map 0:1 audiostream1.m4a
 avconv -y -i videostream1.mp4 -i audiostream1.m4a  -c copy -shortest  video1_aligned.mp4

De même pour la deuxième vidéo et puis j'ai utilisé MP4Box comme précédemment. Malheureusement cela n'a pas fonctionné non plus. Le seul succès que j'ai eu était lorsque j'ai joint les flux vidéo séparément (c'est-à-dire videostream1.mp4 et videostream2.mp4) et les flux audio (c'est-à-dire audiostream1.m4a et audiostream2.m4a) puis j'ai joint la vidéo et l'audio dans un fichier final. Cependant, la synchronisation est perdue pour la seconde moitié de la vidéo. Concrètement, il y a un délai d'1 seconde entre l'audio et la vidéo. Toute suggestion est la bienvenue.

1voto

Erik Points 19

Merci evilsoup; voici un petit script pour automatiser le processus, en utilisant le plus récent avconv.
Au fait, les tubes nommés n'ont pas fonctionné pour moi (la sortie y restait bloquée).

   #!/bin/bash

    for FILE in $@; do
      avconv -i $FILE -map 0 -f mpegts -bsf h264_mp4toannexb -c:v copy -y $FILE.tmp
      IN=$IN\|$FILE.tmp
    done

    IN=${IN#\|}
    avconv -i concat:"$IN" out.mp4

    for FILE in $@; do
      rm $FILE.tmp
    done

1voto

Benjamin Points 11

Avoir connu un grand succès avec

for f in ./*.m4a; do echo "file '$f'" >> mylist.txt; done

vous pourriez avoir besoin de réorganiser légèrement mylist.txt

ffmpeg -f concat -i mylist.txt -c:a libfdk_aac -b:a 128k output.m4a

version de ffmpeg 2.2.3

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X