WAVE 文件由浅入深(一)

最近有一个项目组新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,但是还没有答案。再底层是不是应该和声卡驱动相关了?有经验的人事可以介绍一下。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值