MFC-WAV文件音频格式
在Windows环境下,大部分多媒体文件都依循着一种结构来存放信息,称为资源互换文件格式(Resources Interchange File Format),简称RIFF
块chunk
RIFF是一种树状结构,其基本组成单位是chunk(即块),每个chunk由辨识码,数据大小和数据组成,如下图。可以看出,一个chunk的长度,就是数据的大小加上8Byte
一般而言,chunk本身不允许内部再包含chunk,但有两个例外:以"RIFF"和以"UST"为辨识码的chunk。针对这两种chunk,RIFF又从原先的"裸数据"中切出4Byte作为"格式辨别码",如下图所示
WAV文件头
顾名思义,WAV就是波形音频文件(Wave Audio),是Windows中用来表示数字化声音的一种标准格式,其文件扩展名为.wav,是一种非常简单的RIFF文件,格式辨识码为"WAVE".整个WAV文件分成两部分:文件头和数据块.
WAV格式文件主要有两种文件头
标准的44字节文件头
这种WAV是最简单的一种RIFF格式,包含两个chunk:<fmt—chunk>,<wave—data>,这两个子块都是一个WAV文件必须包含的
RIFF WAVE Chunk:
以'RIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID和Size所占用的字节数,即FileLen - 8 =Size.然后是Type字段,为'WAVE',表示是wav文件
Format Chunk:
以'fmt '作为标示.一般情况下Size为16,此时最后附加信息没有;如果为18则最后多了2个字节的附加信息.主要由一些软件制成的wav格式中含有该2个字节的
58字节文件头
如果不是Windows的标准WAV文件,而是经过了一些软件处理的,往往就是58字节的文件头,如下图所示
它比44字节的多了一个fact子块.<fact—ck>储存了关于WAV文件内容的重要信息
"data"子块数据安排方式
Windows中"data"子块中数据存放的形式如下图所示,根据声道数不同及取样位数的不同,安排4位的位置.
注意:Windows中将16位值的范围定为[-32768,32767].另外,0并不一定代表无声,而是由中间数值来决定,即8位的时候为128,l6位时0才是无声.所以,编程中需要放入无声的数据时,必须先认清声音格式是l6位还是8位. 通常解压缩后得到的文件仅仅是裸数据,不能正常播放声音.了解了WAV文件格式后,就可以按照标准的44字节格式,在解码数据前编写一个正确的WAV文件头,使其成为一个有效的WAV文件
wave族消息
当使用 waveIn 和 waveOut 函数进行声音采集和播放时,会触发以下几个消息:
1. MM_WIM_OPEN:
- 触发时机:当音频输入设备开始采集音频数据时触发。
- 事件含义:表示音频输入设备已打开并准备好接收音频数据。
wParam = (WPARAM) hInputDev 已打开设备的句柄
lParam = reserved 保留;必须为零
2. MM_WIM_DATA:
- 触发时机:当音频输入设备采集到一定量的音频数据时触发。
- 事件含义:表示有新的音频数据可供应用程序处理。
wParam = (WPARAM) hInputDev 接收数据的波形音频输入设备的句柄
lParam = (LONG) lpwvhdr 指向 WAVEHDR 结构的指针,该结构标识包含数据的缓冲区
3. MM_WIM_CLOSE:
- 触发时机:当音频输入设备停止采集音频数据时触发。
- 事件含义:表示音频输入设备已关闭,不再接收音频数据。
wParam = (WPARAM) hInputDev
lParam = reserved 保留;必须为零
4. MM_WOM_OPEN:
- 触发时机:当音频输出设备开始播放音频数据时触发。
- 事件含义:表示音频输出设备已打开并准备好接收音频数据进行播放。
wParam = (WPARAM) hOutputDev 已打开设备的句柄
lParam = reserved 保留;必须为零
5. MM_WOM_DONE:
- 触发时机:当音频输出设备完成对一块音频数据的播放时触发。
- 事件含义:表示音频输出设备已完成对一块音频数据的播放。
wParam = (WPARAM) hOutputDev 播放缓冲区的波形音频输出设备的句柄
lParam = (LONG) lpwvhdr 指向标识缓冲区的 WAVEHDR 结构的指针
6. MM_WOM_CLOSE:
- 触发时机:当音频输出设备停止播放音频数据时触发。
- 事件含义:表示音频输出设备已关闭,不再播放音频数据。
wParam = (WPARAM) hOutputDev 设备的句柄
dwParam2 = reserved 保留;必须为零
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
2019-08-02 python---注册表操作