Объединить несколько файлов 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 ...