web-dev-qa-db-fra.com

Concaténer plusieurs fichiers WAV en une seule commande, sans fichier supplémentaire

Je souhaite concaténer plusieurs fichiers WAV en un seul fichier WAV avec FFMPEG.

J'ai utilisé la commande suivante et 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 constater, 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 seule commande 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 Merci de m'aider à écrire une seule commande (ou à corriger les 2 commandes ci-dessus) permettant d'obtenir le résultat souhaité.

Ne suggérez pas d'autres encodeurs/éditeurs de supports, je souhaite uniquement utiliser FFMPEG, car il est déjà installé et utilisé à d'autres endroits.

29
Manu

Vous pouvez essayer d’utiliser le filtre concat ; cela nécessite un ré-encodage, et nécessitera donc plus de ressources système (une quantité infime sur n'importe quel ordinateur vaguement moderne dans ce cas particulier), mais PCM -> L'audio 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.

32
evilsoup

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 une série de fichiers .wav tout en conservant l'ordre numérique (non zéros)?

15
Héctor M. Monacci

Le wiki FFmpeg mentionné à l'aide du protocole concat n'est pas possible avec tous les types de fichiers. Cela fonctionne bien avec la plupart des conteneurs MPEG et des trains de bits, mais évidemment pas avec les fichiers WAV avec audio PCM.

Vous n'êtes pas obligé de créer un fichier temporaire et de l'utiliser. Avec Bash (ou d'autres shells prenant en charge le processus de substitution ), 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, plus précisément, un descripteur de fichier - à la volée, que ffmpeg peut lire. Ce fichier contiendra le chemin d'accès à chaque fichier .wav du répertoire actuel. 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.

9
slhck

Une autre option consiste à utiliser concat

ffmpeg -i "concat: fichier1.mp3 | fichier2.mp3 | fichier3.mp3" -acodec copy out.mp3

3
Ivan Malyshev

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 occupez pas des noms de fichiers source ou du paramètre concat-count.

1
Bilbo