最近有一个项目组新idea,其中需要用手机的MIC来检测周围的噪声水平。首先不管手机的MIC是否能够满足噪声检测的需求(本人想还是很难的),我打算在PC上试验一下,看看PC上普通的MIC是否可以。就这样开始入手有关MIC录音的一些技术资料,渐渐由浅入深慢慢对WAVE文件有了全新了解。
本文就沿着由浅入深的顺序,依次介绍:
1. WAVE文件录放音Windows API
2. WAVE文件的格式
3. IMA - ADPCM编码
一、WAVE文件录放音Windows API
Windows为开发者提供了一套wave******() 函数,用以从声卡获取声音文件数据和其他一些相关操作。在MSDN上的Windows Multimedia主题下可以找到相关wave函数内容。
l 如果我们只是做一个录音和放音程序,以下几个函数需要用到:
waveInOpen 打开录音设备函数
waveInPrepareHeader 为录音设备准备缓存函数
waveInAddBuffer 给输入设备增加一个缓存
waveInStart 开始录音
waveInUnprepareHeader 清除缓存
waveInReset 停止录音
waveInClose 关闭录音设备
waveOutOpen 打开放音设备
waveOutPrepareHeader 为放音设备准备缓存
waveOutWrite 放音
l waveform-audio 缓存格式:
typedef struct {
LPSTR lpData; //内存指针
DWORD dwBufferLength;//长度
DWORD dwBytesRecorded; //已录音的字节长度
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops; //循环次数
struct wavehdr_tag * lpNext;
DWORD reserved;
} WAVEHDR;
l 相关windows消息:
MM_WIM_OPEN: 打开设备时消息,在此期间我们可以进行一些初始化工作
MM_WIM_DATA:当缓存已满或者停止录音时的消息,处理这个消息可以对缓存进行重新分配,实现不限长度录音
MM_WIM_CLOSE:关闭录音设备时的消息。
l 录音程序流程:
waveInOpen -> waveInPrepareHeader -> waveInAddBuffer -> waveInStart -> waveInReset ->waveInClose
当开始录音后当buffer已满时,将收到MM_WIM_DATA消息,处理该消息可以保存已录好数据。
l 放音程序流程:
waveOutOpen -> waveOutPrepareHeader -> waveOutWrite ->waveOutRest -> waveOutClose
l 参考链接和录放音源代码:
对于开发者来说,源码是很重要的。很幸运,我们能够在网上找到不少优质示例源码。以下两个链结的程序都可以实现录放音功能,并且有使用说明,第二个链结可以保存录音WAVE文件。
http://www.vckbase.com/document/viewdoc/?id=904
http://www.vckbase.com/document/viewdoc/?id=1800
l 更底层API
这套wave函数是以传入API一段缓存的方式来获取声音数据的。只有这段缓存已经填满或者停止录音的时候才能读取缓存中的内容。实际应用中,我们需要对声音实时处理,像某些专业声音合成软件,声音录入的时候我们能实时看到波形,这个是用什么API实现的呢?我试图找更底层的API,但是还没有答案。再底层是不是应该和声卡驱动相关了?有经验的人事可以介绍一下。