压缩PCM数据

我正在使用WinAPI – Wavefunction来创建一个记录麦克风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中都不适合我…

那我该怎么办?

谢谢!

最简单的方法是简单地将采样率从44100降低到更易于管理的范围,如22050,16000,11025甚至8000.大多数语音编解码器的速度都不会超过16000赫兹。 而较旧的则针对8khz进行了优化。

下一步是找到编解码器。 有一些编解码器可以与Windows音频压缩管理器一起使用,但几乎所有编解码器都可以追溯到Windows 95,并且在解压缩后按现代标准听起来很糟糕。

您始终可以使用Format SDK或Media Foundation API实时转换为WMA 。 或者只是去获得像LAME这样的开源MP3库。

对于电话质量语音,您可以将每个样本更改为8位,采样率为8000.这将大大减少数据量。

GSM具有良好的压缩性。 您可以使用acmStreamConvert()将PCM数据块转换为GSM(或您已安装的任何其他编解码器acmStreamConvert() 。 有关更多详细信息,请参阅MSDN:

将数据从一种格式转换为另一种格式