Объединить несколько файлов WAV с помощью одной команды, без дополнительного файла

Я хочу объединить несколько файлов WAV в один файл WAV с помощью FFMPEG.

Я использовал следующую команду, и она генерирует необходимый файл.

Команда:

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

Файл:

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

Но, как вы можете видеть, проблема заключается в том, что мне нужно создать текстовый файл, чтобы указать список файлов WAV для объединения.

Я могу выполнить все эти задачи, но я бы предпочел одну команду, которая выглядит как

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

или же

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

Я пробовал эти две простые команды, но они возвращают только голос 1.wavПожалуйста, помогите мне написать одну команду (или исправить вышеупомянутые 2 команды), которая достигает желаемого результата.

Пожалуйста, не предлагайте другие медиа-кодеры / редакторы, я хочу использовать только FFMPEG, так как он уже установлен и используется в других местах.

7 ответов

Решение

Вы можете попробовать использовать фильтр concat; он требует перекодирования и поэтому потребует больше системных ресурсов (в данном конкретном случае довольно небольшого количества на любом неопределенно современном компьютере), но звук PCM -> PCM должен быть математически без потерь. В вашем случае вы бы использовали что-то вроде:

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

Если у вас есть пять входных файлов, используйте n=5,

Я думаю, что лучше всего использовать sox, а не ffmpeg:

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

Решение исходит из того, как добавить кучу WAV-файлов, сохраняя (не с добавлением нуля) числовой порядок?

В FFmpeg упоминается использование concat Протокол не возможен со всеми типами файлов. Он отлично работает с большинством MPEG-контейнеров и битовых потоков, но, очевидно, не с файлами WAV со звуком PCM.

Вам не обязательно создавать временный файл и использовать его. С помощью Bash (или других оболочек, поддерживающих подстановку процессов) вы можете делать все одной командой:

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

Процесс замещения <( ) создает файл - или, если быть точным, дескриптор файла - на лету, который ffmpeg могу читать. Этот файл будет содержать путь к каждому .wav файл в текущем каталоге. Мы должны префикс это с $(pwd) чтобы получить правильный путь относительно вашего текущего каталога, а не относительно дескриптора файла.

Конечно, команда в пределах замены может быть изменена на что-то другое.

Другой вариант - использовать concat

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

Я видел, как люди публиковали похожие ответы, но никогда не видел именно такого ответа, который отлично работает.

      sox "file*" output.wav

Приведенная выше команда объединит все файлы и будет использовать символ * в качестве подстановочного знака. Вы используете кавычки, чтобы избежать выполнения расширения вашей оболочкой. Вместо этого мы позволяем sox выполнить расширение таким образом, что любой из ваших параметров будет применен к каждому аудиофайлу.

В Win8 Cmd.EXE .BAT скрипт:

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

Таким образом, вы не будете беспокоиться об именах исходных файлов или параметре concat-count.

Вы могли бы использовать shntool для wav-файлов.

shnjoin -r none 01.wav 02.wav ...
Другие вопросы по тегам