【发布时间】:2014-03-16 00:56:13
【问题描述】:
我正在使用 WinAPI - Wave 函数创建一个录制程序,用于录制麦克风 X 秒。网上搜了一下,发现PCM数据太大了,通过socket发送会有问题……
我怎样才能把它压缩成更小的东西?任何简单/“便宜”的方式?
我还注意到,当我使用 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 中都不适合我......
那我该怎么办?
谢谢!
【问题讨论】:
-
wFormat 标签描述数据。更改它不会更改数据,只会导致它解释错误。您需要的是一个编码器,它将采用 PCM 并输出压缩格式,如 ADPCM 或 Vorbis。
-
您需要一个编解码器。你需要什么编解码器?这取决于你的约束。您是在录制语音、音乐还是其他东西?您是对可以无损下载的文件进行编码还是对实时流进行编码?如果是实时的,你的带宽是多少?回答完这些问题后,您或许可以选择编解码器。
-
@arx 我正在尝试编写一个小的 IP 语音程序
标签: c++ c winapi voip voice-recording