Coller des fichiers MP4 entre eux avec ffmpeg

Pour assembler deux fichiers entre eux sans les transcoder, ffmpeg dispose d’une fonction concat… qui ne fonctionne pas avec des fichiers MP4. Il faut faire un traitement intermédiaire.

Publié le

La solution la plus simple est bien évidement d’utiliser une timeline d’un logiciel de montage. C’est bien, ça marche, parfois c’est rapide, mais ce n’est pas automatisable (ou alors c’est très complexe).

Utilisons donc ffmpeg pour ça ! Sur une version récente il y a une fonction concat qui concatène des fichiers en entrée. C’est ce que l’on va utiliser… sauf que cela ne fonctionne pas avec des fichiers MP4 (container MOV, h264 en codec vidéo, et aac en codec audio).

Préparation

On va d’abord changer de container pour nos flux source, puis les assembler ensuite, car l’on ne va pas refaire de transcodage, juste de la copie de flux.

La fonction concat accepte bien le MPEG Transport Stream, allons y.

ffmpeg -y -i "source1.mp4" -c copy -bsf:v h264_mp4toannexb -f mpegts "source1.ts"

Le -bsf:v h264_mp4toannexb restructure le flux h264 pour qu’il puisse rentrer dans le TS. Il le demande, et ça marche.

Assemblage

Une fois que tous les fichiers a assembler sont passés en TS, faisont donc l’assemblage

ffmpeg -y -i concat:"source1.ts|source2.ts" -absf aac_adtstoasc -c copy -f mov "destination.mp4"

Le -absf aac_adtstoasc restructure le flux AAC pour qu’il puisse rentrer dans le MOV/MP4. Il le demande, et ça marche aussi !

Si cela ne fonctionne pas, vérifiez que vos fichiers ont bien le même format, codec, résolution… A la moindre différence, l’assemblage est impossible.

Qt-faststart

Vous pourrez ensuite passer un coup de qt-faststart sur votre fichier de destination pour permettre son visionnage pendant son téléchargement (téléchargement progresssif).

qt-faststart "destination.mp4" "destination-stream.mp4"

Et voilà pour une soudure parfaite !