midi to ogg - конвейерное искажение

Я пытаюсь преобразовать файлы midi в ogg или mp3. В конце концов это произойдет на веб-сервере Linux, но в настоящее время я использую машину с Windows 7. Я использую timidity для преобразования midi в wav, а затем либо sox, либо ffmpeg для преобразования wav в ogg/mp3.

Когда я использую промежуточный файл, процесс работает нормально (в первой строке ниже робость создает файл.wav)

timidity.exe file.mid -Ow
sox.exe file.wav file.ogg

Однако, когда я пытаюсь направить вывод timidity в sox (как показано ниже), результирующий файл ogg ужасно искажен.

 timidity.exe file.mid -Ow -o - | sox.exe -t wav - file.ogg

и я получаю предупреждение

 sox.exe WARN wav: Premature EOF on .wav input file

Я также получаю ту же проблему искажения, когда я заменяю sox на ffmpeg (и соответствующие параметры командной строки) или когда я заменяю ogg на mp3 в качестве выходного формата.

Так что я делаю неправильно?

Спасибо,

Крис


person Chris Walshaw    schedule 08.07.2014    source источник


Ответы (1)


Что касается самого предупреждения, вы не делаете ничего плохого. Вы также можете увидеть предупреждение от робости, которое выглядит примерно так:

Warning: -: Illegal seek: Can't make valid header

Что там происходит, объясняется на странице руководства timidity:

Если вывод направляется в файл без поиска или если TiMidity++ прерывается перед закрытием файла, заголовок файла будет содержать 0xffffffff в полях RIFF и длины блока данных.

Обратите внимание, что RIFF — это формат кодирования, обычно называемый по расширению файла .wav. Когда timidity записывает RIFF-файл, он не знает, насколько длинным будет этот файл, поэтому записывает какой-то мусор-заполнитель в заголовок и переходит к записи данных. Когда он заканчивает с данными, он знает, как долго файл, поэтому он возвращается к началу файла и записывает этот мусор в заголовке. Когда вы пишете в канал, у него нет возможности вернуться и что-то переписать: нижестоящая программа должна обрабатывать мусор-заполнитель. Также со страницы руководства timidity:

Популярная утилита преобразования звука sox способна считывать такие искаженные файлы, поэтому вы можете напрямую передавать данные в sox для преобразования на лету в другие форматы.

Таким образом, сообщение, которое вы упомянули. Сокс сообщает вам, что повар неправильно приготовил напильник, НО СОКС В ЛЮБОМ СЛУЧАЕ ЕГО СЪЕСТЬ, ПОТОМУ ЧТО СОКС НЕ ПРИБЫЛЬНЫЙ. Сокс явно пассивно-агрессивен. Кто знал?

Вы можете игнорировать эти предупреждающие сообщения, потому что теперь они сообщают вам то, что вы уже знаете. Или вы можете использовать необработанный формат и явно указать timidity и sox, как хорошо играть друг с другом:

timidity file.midi -Or1Ssl -s44.1 -o- | sox -t raw -b 16 -e signed -r 44.1k -c 2 - file.ogg

Что касается искажения, то оно может быть частично вызвано особенностями аудиобиблиотек в системе Windows. Я отмечаю, что конвейер в вопросе без расширений .exe производит вывод без заметных искажений в системе Linux. Использование четко определенного необработанного формата в конвейере также может решить эту проблему.

Обратите внимание, что для вывода в формате Ogg теперь вы можете получить это непосредственно из timidity:

timidity file.midi -o file.ogg -Ov
person wyrm    schedule 25.12.2015