压缩PCM数据

时间:2014-02-16 21:40:13

标签: c++ c winapi voip voice-recording

我正在使用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中都不适合我...

那我该怎么办?

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

Converting Data from One Format to Another