Как программно сжать файл WAV в другой формат (PCM, частота дискретизации 11 025 кГц и т. д.)?
Помощь по сжатию WAV
Ответы (5)
Я бы посмотрел на дерзость... Я почти уверен, что у них нет утилиты командной строки, которая может это сделать, но у них может быть библиотека...
Обновлять:
Похоже, они используют libsndfile, выпущенный под лицензией LGPL. Я бы, например, просто попробовал бы это использовать.
Используйте sox (Sound eXchange: универсальный переводчик звуковых образцов) в Linux: SoX — это программа командной строки, которая может конвертировать самых популярных аудиофайлов в большинство других популярных форматов аудиофайлов. При необходимости он может изменить тип данных аудиосемпла и применить к файлу один или несколько звуковых эффектов во время этого перевода.
Если вы имеете в виду, как сжать данные PCM в другой аудиоформат, то для этого можно использовать множество библиотек, в зависимости от платформ, которые вы хотите поддерживать. Если вы просто хотите изменить частоту дискретизации данных PCM, вам нужен алгоритм преобразования частоты дискретизации, что является совершенно другой проблемой. Можете ли вы быть более конкретными в ваших требованиях?
Вы спрашиваете об повторной выборке, а точнее о понижающей выборке, а не о сжатии. В то время как оба процесса с потерями (это означает, что вы будете страдать от потери информации), субдискретизация работает с необработанными выборками, а не в частотной области.
Если вы заинтересованы в сжатии, вам следует изучить библиотеки lame или OGG vorbis; вы, без сомнения, знакомы с технологиями MP3 и OGG, хотя из вашего вопроса у меня сложилось впечатление, что вы заинтересованы в получении файла PCM с более низкой частотой дискретизации.
В этом случае вам понадобится библиотека ресемплинга, возможностей которой несколько. Наиболее широко известен libsamplerate, который я бы, честно говоря, не рекомендовал из-за проблем с качеством не только внутри сгенерированных аудиофайлов, но и стабильности кода, используемого в самой библиотеке. Другая некоммерческая возможность — это sox, о чем упоминали некоторые другие. В зависимости от характера вашей программы вы можете либо выполнять sox как отдельный процесс, либо вызывать его из собственного кода, используя его как библиотеку. Я лично не пробовал этот подход, но сейчас я работаю над продуктом, в котором мы используем sox (на самом деле, для повышения частоты дискретизации), и мы очень довольны результатами.
Другим вариантом является написание собственной библиотеки преобразования частоты дискретизации, что может оказаться серьезной задачей, но, если вы заинтересованы в преобразовании только с целочисленным коэффициентом (т. е. из 44,1 кГц в 22 кГц или от 44,1 кГц до 11 кГц), то это на самом деле очень просто, так как вам нужно только вырезать каждый N-й сэмпл.
В Windows вы можете использовать Audio Compression Manager для преобразования между файлами (функции acm...). Вам также понадобятся практические знания структуры WAVEFORMAT и форматов файлов WAV. К сожалению, чтобы написать все это самостоятельно, потребуется некоторое время, поэтому может быть хорошей идеей изучить некоторые варианты с открытым исходным кодом, предложенные другими.
Я написал свою собственную аудиобиблиотеку .NET с открытым исходным кодом под названием NAudio, которая может конвертировать файлы WAV из одного формата. на другой, используя кодеки ACM, установленные на вашем компьютере. Я знаю, что вы отметили этот вопрос как C++, но если .NET приемлем, это может сэкономить вам время. Взгляните на проект NAudioDemo для примера преобразования файлов.