Об'єднайте кілька 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.
Ryan DuVal

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
Nobu

3

Ще один варіант - використовувати конмат

ffmpeg -i "concat: file1.mp3 | file2.mp3 | file3.mp3" -acodec копіювати.mp3


1
Ласкаво просимо до суперпользователя: Хоча це може чи не може відповісти на питання, (відповідь прийнято), було б кращою відповіддю, якщо ви могли б дати пояснення, чому ваше рішення працює з деталізацією та легко виконувати інструкції. Якщо ви вважаєте, що ваша відповідь правильна, зробіть це та повторіть редагування. Будь ласка, знайдіть пару хвилин і прочитайте: - superuser.com/help. Відповідь: superuser.com/help/how-to-answer , знову ласкаво просимо до
суперпользователя.Танкйоу

Я перевірив це, і, схоже, це не працює
Нік Лонг

1

У сценарії Cmd.EXE .BAT 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

Таким чином, ви не турбуєтесь з іменами вихідних файлів або параметром countat-count.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.