web-dev-qa-db-fra.com

ffmpeg joindre deux fichiers mp4 avec ffmpeg en ligne de commande

Je peux joindre avec succès plusieurs fichiers à l'aide de la commande suivante:

ffmpeg -f concat -i input.txt -codec copy output.mp4

Le seul problème avec cette commande est que vous devez lire les chemins de fichiers à partir du fichier texte appelé input.txt avec le contenu suivant:

file 'C:\Users\fabio\Downloads\Super\Sharks\01.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\02.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\03.mp4'

Existe-t-il un moyen d'atteindre le même objectif sans avoir à lire les chemins de fichiers à partir d'un fichier? J'ai essayé ce qui suit sans succès:

ffmpeg -f concat -i file "C:\a\b\01.mp4" file "C:\a\b\02.mp4" -codec copy output.mp4
ffmpeg -f concat -i "C:\a\b\01.mp4" "C:\a\b\02.mp4" -codec copy output.mp4

Dois-je utiliser une commande différente?

21
Fabio Delarias

Mise à jour 2019:

Comme mentionné dans les commentaires, Stack Overflow contient une excellente description des options de concaténation disponibles, ainsi qu'une discussion sur la méthode à utiliser en fonction des types de fichiers que vous utilisez:

Comment concaténer deux fichiers MP4 en utilisant FFmpeg?

Réponse originale de 2016:

Vous devriez pouvoir utiliser la méthode concat protocol pour combiner les fichiers:

ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4

De plus, le manuel de FFmpeg décrit une méthode spécifique aux fichiers MP4 afin de les concaténer sans perte, mais nécessite la création de fichiers temporaires (ou de canaux nommés):

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
30
Carson Darling

Non, il semble n'y avoir aucun moyen d'utiliser le démultiplexeur ffmpeg concat sur une seule ligne de commande sans aucun piratage. Vous devez créer le fichier texte d'entrée avec la liste des fichiers. Je pensais que c'était étrange moi-même, peut-être que quelqu'un ajouterait cela aussi à FFMpeg à une date ultérieure.

La réponse acceptée à cette question utilise le protocole de concat, pas le démultiplicateur de concat, comme demandé par l'OP.

1
georgiecasey

Vous pouvez remplacer fichier par liste en affichant liste à stdout et en lisant la liste à partir de stdin par ffmpeg:

(echo file 'a.mp4' & echo file 'b.mp4') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "result.mp4"
1
Qwertiy