我正在使用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中都不适合我...
那我该怎么办?
谢谢!
答案 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: