6

У меня есть много (7500) WAV-файлов (названных по их номерам), которые я хотел бы объединить в один. Я думаю, что это должно быть сделано с помощью цикла bash, потому что при использовании глобирования некоторые файлы будут в неправильном порядке (например, 1111 до 2).

Какой лучший способ сделать это под Linux?

1 ответ1

10

Если все файлы имеют одинаковые параметры, такие как частота дискретизации и количество каналов, вы все равно не можете просто их объединить. Вы должны удалить WAV-заголовок.

Возможно, проще всего использовать утилиту для манипулирования аудиофайлами, например, sox , которая содержит метод для катации файлов. На самом деле, он делает это по умолчанию. Например, чтобы объединить три WAV-файла в один длинный:

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

Цикл не упорядочит файлы в нужном вам порядке. Вам нужно отсортировать имена, но обработать их численно. sort -n сделает это

Таким образом:

$ sox $(ls *.wav | sort -n) out.wav

Если sox не может обработать такое количество файлов, мы можем разбить работу следующим образом:

$ ls *.wav | sort -n > script

Тогда у нас есть файл сценария, который выглядит так:

1.wav
2.wav
...
3999.wav
4000.wav
...
file7500.wav

Мы редактируем это, чтобы сделать несколько командных строк:

# catenate about half the files to temp1.wav   
sox \
1.wav \
2.wav \
... \
3999.wav \
temp1.wav

# catenate the remainder to temp2.wav  
sox \
4000.wav \
... \
7500.wav \
temp2.wav

# catenate the two halves
sox temp1.wav temp2.wav out.wav ; rm temp1.wav temp2.wav

В качестве первого шага редактирования списка файлов вы можете использовать команду vi :%s/.*/& \\/ чтобы добавить обратную косую черту после каждой строки.

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