24

Я хочу объединить несколько файлов 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, так как он уже установлен и используется в других местах.

6 ответов6

27

Вы можете попробовать использовать фильтр 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 .

13

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

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

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

7

Вики 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) чтобы получить правильный путь относительно вашего текущего каталога, а не относительно дескриптора файла.

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

3

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

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

1

В 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.

-1

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

shnjoin -r none 01.wav 02.wav ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .