Concaténer plusieurs fichiers WAV à l'aide d'une seule commande, sans fichier supplémentaire


32

Je souhaite concaténer plusieurs fichiers WAV en un seul fichier WAV à l'aide de FFMPEG.

J'ai utilisé la commande suivante et elle génère le fichier requis.

Commander:

ffmpeg -f concat -i mylist.txt -c copy output.wav

Fichier :

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'

Mais comme vous pouvez le voir, le problème est que je dois créer un fichier texte pour spécifier la liste des fichiers WAV à concaténer.

Je peux faire toutes ces tâches, mais je préférerais une commande unique quelque chose qui ressemble à

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 

ou

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav

J'ai essayé ces deux commandes simples mais elles ne renvoient que la voix de 1.wav Veuillez m'aider à écrire une seule commande (ou corriger les 2 commandes ci-dessus) qui permet d'obtenir le résultat souhaité.

Veuillez ne pas suggérer d'autres encodeurs / éditeurs multimédias, je veux utiliser FFMPEG uniquement, car il est déjà installé et utilisé à d'autres endroits.

Réponses:


34

Vous pouvez essayer d'utiliser le filtre concat ; cela nécessite un ré-encodage, et cela prendra donc plus de ressources système (une quantité assez petite sur n'importe quel ordinateur vaguement moderne dans ce cas particulier), mais l'audio PCM -> PCM devrait être mathématiquement sans perte. Dans votre cas, vous utiliseriez quelque chose comme:

ffmpeg -i input1.wav -i input2.wav -i input3.wav -i input4.wav \
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' \
-map '[out]' output.wav

Si vous avez cinq fichiers d'entrée, utilisez n=5.


4
Remarque: Ne personnalisez pas [0:0][1:0][2:0][3:0]pour correspondre au nombre de fichiers. Utilisez-le exactement comme il est dit. La seule chose que vous devez changer est les fichiers d'entrée et n=4.
Keavon

8
@Keavon: êtes-vous sûr? Ici, ffmpeg (version N-49352-gc46943e x64) se plaint Too many inputs specified for the "concat" filter.lorsque j'essaie de traiter seulement 2 entrées avec le code d'origine. Cela fonctionne quand je supprime [2:0][3:0]... ce qui est logique pour moi car dans ce cas, il n'y a pas de flux 2:0et 3:0...
Bigue Nique

Je suis d'accord avec @BigueNique. Moi aussi, je suis tombé sur la même erreur et bien que cela semble un peu idiot, j'ai écrit du code pour générer la séquence appropriée donnée n.
Ryan DuVal

19

Je pense que la meilleure option est d'utiliser sox, pas ffmpeg:

$ sox short1.wav short2.wav short3.wav long.wav

La solution vient de Comment puis-je ajouter un tas de fichiers .wav tout en conservant l'ordre numérique (sans remplissage nul)?


1
Cela peut fonctionner .wav, mais soxne semble pas prendre en charge .mp3.
Aaron Franke

1
La question portait précisément sur.wav
Héctor M. Monacci

1
Je sais, j'ajoute juste une note pour quiconque essaie d'utiliser cette méthode avec des fichiers non-wav.
Aaron Franke

la question indiquait explicitement qu'une solution est requise en utilisant uniquement ffmpeg!
Manu

sox peut également prendre en charge les fichiers .mp3
Benjamin

9

Le wiki FFmpeg mentionne que l' utilisation du concatprotocole n'est pas possible avec tous les types de fichiers. Cela fonctionne très bien avec la plupart des conteneurs MPEG et des flux binaires, mais évidemment pas les fichiers WAV avec audio PCM.

Vous n'avez pas nécessairement à créer un fichier temporaire et à l'utiliser. Avec Bash (ou d'autres shells qui prennent en charge la substitution de processus ), vous pouvez tout faire en une seule commande:

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

La substitution de processus <( )crée un fichier - ou, pour être précis, un descripteur de fichier - à la volée, qui ffmpegpeut être lu. Ce fichier contiendra le chemin d'accès à chaque .wavfichier du répertoire courant. Nous devons le préfixer avec $(pwd)pour obtenir le chemin correct par rapport à votre répertoire actuel, et non par rapport au descripteur de fichier.

Bien sûr, la commande dans la substitution peut être changée en autre chose.


2
Si vous obtenez une Unsafe file nameerreur, vous aurez besoin d'une -safe 0option avant -i. réf. stackoverflow.com/q/38996925/297679
Nobu

3

Une autre option consiste à utiliser concat

ffmpeg -i "concat: file1.mp3 | file2.mp3 | file3.mp3" -acodec copy out.mp3


1
Bienvenue au superutilisateur: bien que cela puisse ou non répondre à la question, (une réponse a été acceptée), ce serait une meilleure réponse si vous pouviez expliquer pourquoi votre solution fonctionne avec des détails et des instructions faciles à suivre. Si vous pensez que votre réponse est correcte, procédez comme suit et rééditez. Veuillez prendre quelques minutes et lire: - superuser.com/help .Réponse: superuser.com/help/how-to-answer , encore une fois bienvenue à superuser.Thankyou
mic84

J'ai testé cela et cela ne semble pas fonctionner
Nick Long

1

Dans le script Cmd.EXE .BAT de Win8:

Rem Get number of source files
For /F %%A In ('Dir *.3gp /B /A-D ^| Find /C /V ""') Do      Set FilCnt=%%A

Rem Build list of source filenames
Set Lst=
For    %%A In (     *.3gp                          ) Do Call Set Lst=%%Lst%% -i %%A

Rem Concat and Convert sources to target
FFMPeg.EXE %Lst% -filter_complex concat=n=%FilCnt%:v=0:a=1 -vn Output.OGG

De cette façon, vous ne vous souciez pas des noms de fichiers source ou du paramètre de décompte concaténé.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.