我正在使用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中都不适合我.
那我能做什么呢?
谢谢!
发布于 2014-02-17 07:38:43
最简单的方法是简单地将样本率从44100降到22050、16000、11025甚至8000。大多数语音编解码器都不会超过16000赫兹。而老的则是为8khz而优化的。
下一步是找到一个编解码器。Windows音频压缩管理器中有一些编解码器可供使用,但几乎所有的编解码器都可以追溯到Windows 95,按现代标准来看,解压缩后听起来糟透了。
您可以使用SDK格式或使用Media实时转换为WMA。或者,只需获得一个开源的MP3库,比如跛脚。
发布于 2014-02-16 21:50:25
对于电话质量的语音,您可以更改为8位每样本和样本率为8000。这将大大减少数据量。
发布于 2014-02-16 22:11:35
GSM具有良好的压缩性能。您可以使用acmStreamConvert()将一块PCM数据转换为GSM (或已安装的任何其他编解码器)。有关更多详细信息,请参阅MSDN:
将数据从一种格式转换为另一种格式
https://stackoverflow.com/questions/21817052
复制相似问题