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


32

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

Ответы:


34

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


4
Примечание. Не настраивайте [0:0][1:0][2:0][3:0]в соответствии с количеством файлов. Используйте это именно так, как он говорит. Единственное, что вы должны изменить, это входные файлы и n=4.
Кивон

8
@Keavon: ты уверен? Здесь ffmpeg (версия N-49352-gc46943e x64) жалуется, Too many inputs specified for the "concat" filter.когда я пытаюсь обработать только 2 ввода с исходным кодом. Это работает, хотя, когда я удаляю [2:0][3:0]... что имеет смысл для меня, так как в этом случае нет таких вещей, как потоки 2:0и 3:0...
Bigue Nique

Я согласен с @BigueNique. Я тоже столкнулся с той же ошибкой и, хотя она кажется немного глупой, написал код, чтобы сгенерировать правильную последовательность действий n.
Райан ДюВаль

19

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

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

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


1
Это может работать .wav, но sox, похоже, не поддерживает .mp3.
Аарон Франке

1
Вопрос был именно о.wav
Гектор М. Моначчи

1
Я знаю, я просто добавляю примечание для тех, кто пытается использовать этот метод с файлами, отличными от WAV.
Аарон Франке

в вопросе четко сказано, что решение требуется только с использованием ffmpeg!
Ману

sox также может поддерживать файлы .mp3
Бенджамин,

9

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

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


2
Если вы получили Unsafe file nameошибку, вам понадобится -safe 0опция раньше -i. ссылка stackoverflow.com/q/38996925/297679
Нобу

3

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

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


1
Добро пожаловать в суперпользователя: хотя это может или не может ответить на вопрос (ответ принят), было бы лучше ответить, если бы вы могли дать какое-то объяснение, почему ваше решение работает с подробностями и простыми инструкциями. Если вы чувствуете, что ваш ответ правильный, сделайте это и отредактируйте. Пожалуйста, уделите пару минут и прочитайте: - superuser.com/help. Ответ: superuser.com/help/how-to-answer , еще раз добро пожаловать в superuser.Спасибо
mic84

Я проверил это, и это, кажется, не работает
Ник Лонг

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.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.