Сжатие данных PCM

Я использую функции WinAPI — Wave для создания программы записи, которая записывает микрофон в течение X секунд. Я немного искал по сети, и обнаружил, что данные PCM слишком велики, и будет трудно отправить их через сокеты …

Как я могу сжать его до чего-то меньшего? Любой простой / «дешевый» способ?

Я также заметил, что когда я объявляю формат с помощью функций Wave API, я использую этот код:

WAVEFORMATEX pFormat;
pFormat.wFormatTag= WAVE_FORMAT_PCM;     // simple, uncompressed format
pFormat.nChannels=1;                    //  1=mono, 2=stereo
pFormat.nSamplesPerSec=sampleRate;      // 44100
pFormat.nAvgBytesPerSec=sampleRate*2;   // = nSamplesPerSec * n.Channels * wBitsPerSample/8
pFormat.nBlockAlign=2;                  // = n.Channels * wBitsPerSample/8
pFormat.wBitsPerSample=16;              //  16 for high quality, 8 for telephone-grade
pFormat.cbSize=0;

Как вы видете, pFormat.wFormatTag= WAVE_FORMAT_PCM;
возможно я могу вставить вместо WAVE_FORMAT_PCM что-то еще, так что это будет сжато сразу?
Я проверил MSDN для других значений, хотя ни одно из них не работает для меня в моей Visual Studio …

Так что я могу сделать?

Спасибо!

1

Решение

Самый простой способ — просто снизить частоту дискретизации с 44100 до более управляемой, например, 22050, 16000, 11025 или даже 8000. Большинство голосовых кодеков в любом случае не превышают 16000 Гц. А старшие оптимизированы для 8 кГц.

Следующий шаг — найти кодек. Есть несколько кодеков для использования с Windows Audio Compression Manager, но почти все они относятся к Windows 95 и после распаковки звучат ужасно по современным стандартам.

Вы всегда можете конвертировать в WMA в режиме реального времени с использованием Format SDK или API Media Foundation. Или просто возьмите MP3-библиотеку с открытым исходным кодом, такую ​​как ЛАМЕ.

3

Другие решения

Для качества телефонной речи вы можете изменить значение на 8 бит на выборку и частоту выборки 8000. Это значительно сократит объем данных.

1

GSM имеет хорошее сжатие. Вы можете преобразовать блок данных PCM в GSM (или любой другой кодек, который вы установили), используя acmStreamConvert(). Обратитесь к MSDN для более подробной информации:

Преобразование данных из одного формата в другой

1
По вопросам рекламы [email protected]