RIFF和WAVE音频文件格式
RIFF file format
RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构。RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF格式存储的数据有(包含有:):
(文件格式和数据格式是两码事情)
- 音频视频交错格式数据 .AVI
- 波形格式数据 .WAV
- 位图数据格式 .RDI
- MIDI格式数据 .RMI
- 调色板格式 .PAL
- 多媒体电影 .RMN
- 动画光标 .ANI
- 其他的RIFF文件 .BND
CHUNK
chunk
是RIFF文件的基本单元,其基本结构如下:
struct chunk
{uint32_t id; // 块标志 uint32_t size; // 块大小 uint8_t data[size]; // 块数据 };
- id 4字节,用以标识块中所包含的数据。如:RIFF,LIST,fmt,data,WAV,AVI等,由于这种文件结构 最初是由Microsoft和IBM为PC机所定义,RIFF文件是按照小端 little-endian字节顺序写入的。
- size 块大小 存储在data域中的数据长度,不包含id和size的大小
- data 包含数据,数据以字为单位存放,如果数据长度为奇数(字节为单位),则最后添加一个空字节。
chunk
是可以嵌套的,但是只有块标志为RIFF或者LIST的chunk才能包含其他的chunk。
RIFF chunk
标志为RIFF的chunk是比较特殊的,每一个RIFF文件首先存放的必须是一个RIFF chunk,并且只能有这一个标志为RIFF的chunk。RIFF的数据域的起始位置是一个4字节码(FOURCC),用于标识其数据域中chunk的数据类型;紧接着数据域的内容则是包含的subchunk,如下图
这是一个RIFF chunk中包含有两个subchunk,可以看出RIFF chunk的数据域首先是是4字节的 Form Type,接着是两个subchunk,每一个subchun有包含有自己的标识、数据域的大小以及数据域。
除了RIFF cunk可以嵌套其他的chunk外,另一个可以有subchunk的就是LIST chunk。
上图中,首先是RIFF文件必须的RIFF chunk,其数据域又包含有两个subchunk,其中一个subchunk的类型为LIST,该LIST chunk又包含了两个subchunk。
(list chunk 是否可以做首)
FourCC
FourCC 全称为Four-Character Codes,是一个4字节32位的标识符,通常用来标识文件的数据格式。例如,在音视频播放器中,可以通过 文件的FourCC来决定调用那种CODEC进行视音频的解码。例如:DIV3,DIV4,DIVX,H264等,对于音频则有:WAV,MP3等。对于上面的RIFF文件,则有:RIFF,WAVE,fmt,data等。FourCC是4个ASCII字符,不足四个字符的则在最后补充空格(不是空字符)。比如,FourCC fmt,实际上是'f' 'm' 't' ' '。
FourCC的生成通常可以使用如下宏:
#define MAKE_FOURCC(a,b,c,d) \
( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
在程序 中还是不要使用太长的宏为好,在C++中可以使用模板和enum结合的方式。来保证在编译时期就能够将FourCC生成出来。
#define FOURCC uint32_t
template <char ch0, char ch1, char ch2, char ch3> struct MakeFOURCC{ enum { value = (ch0 << 0) + (ch1 << 8) + (ch2 << 16) + (ch3 << 24) }; }; FOURCC fourcc_fmt = MakeFOURCC<'f', 'm', 't', ' '>::value;
将字符常量传入模板,在结构体中声明一个enum,编译器会在编译时期确定枚举值,这样就能给保证FOURCC在编译就能生成出来。
WAV file
WAV 是Microsoft开发的一种音频文件格式,它符合上面提到的RIFF文件格式标准,可以看作是RIFF文件的一个具体实例。既然WAV符合RIFF规范,其基本的组成单元也是chunk。一个WAV文件通常有三个chunk以及一个可选chunk,其在文件中的排列方式依次是:RIFF chunk,Format chunk,Fact chunk(附加块,可选),Data chunk。
一个WAV文件,首先是一个RIFF chunk;RIFF chunk又包含有Format chunk,Data chunk以及可选的Fact chunk。各个chunk中字段的意义如下:
- RIFF chunk
- id
FOURCC 值为'R' 'I' 'F' 'F' - size
其data字段中数据的大小 字节数 - data
包含其他的chunk
- id
- Format chunk
- id
FOURCC 值为 'f' 'm' 't' ' ' - size
数据字段包含数据的大小。如无扩展块,则值为16;有扩展块,则值为= 16 + 2字节扩展块长度 + 扩展块长度或者值为18(只有扩展块的长度为2字节,值为0) - data
存放音频格式、声道数、采样率等信息- format_tag
2字节,表示音频数据的格式。如值为1,表示使用PCM格式。 - channels
2字节,声道数。值为1则为单声道,为2则是双声道。 - samples_per_sec
采样率,主要有22.05KHz,44.1kHz和48KHz。 - bytes_per sec
音频的码率,每秒播放的字节数。samples_per_sec * channels * bits_per_sample / 8,可以估算出使用缓冲区的大小 - block_align
数据块对齐单位,一次采样的大小,值为声道数 * 量化位数 / 8,在播放时需要一次处理多个该值大小的字节数据。 - bits_per_sample
音频sample的量化位数,有16位,24位和32位等。 - cbSize
扩展区的长度 - 扩展块内容
22字节,具体介绍,后面补充。
- format_tag
- id
- Fact chunk(option)
- id
FOURCC 值为 'f' 'a' 'c' 't' - size
数据域的长度,4(最小值为4) - 采样总数 4字节
- id
- Data chunk
- id
FOURCC 值为'd' 'a' 't' 'a' - size
数据域的长度 - data
具体的音频数据存放在这里
- id
采用压缩编码的WAV文件,必须要有Fact chunk,该块中只有一个数据,为每个声道的采样总数。
Format chunk 中的编码方式
在Format chunk中,除了有音频的数据的采样率、声道等音频的属性外,另一个比较主要的字段就是format_tag,该字段表示音频数据是以何种方式编码存放的。其具体的取值可以为以下:
- 0x0001
WAVE_FORMAT_PCM,采用PCM格式 - 0x0003
WAVE_FORMAT_IEEE_FLOAT,存放的值为IEEE float,范围为[-1.0f,1.0f] - 0x0006
WAVE_FORMAT_ALAW , 8bit ITU-T G.711 A-law - 0x0007
WAVE_FORMAT_MULAW,8bit ITU-T G.711 μμ-law - 0XFFFE
WAVE_FORMAT_EXTENSIBLE,具体的编码方式有扩展区的 sub_format字段决定
关于扩展格式块
当WAV文件使用的不是PCM编码方式是,就需要扩展格式块,它是在基本的Format chunk又添加一段数据。该数据的前两个字节,表示的扩展块的长度。紧接其后的是扩展的数据区,含有扩展的格式信息,其具体的长度取决于压缩编码的类型。当某种编码方式(如 ITU G.711 a-law)使扩展区的长度为0,扩展区的长度字段还必须保留,只是其值设置为0。
扩展区的各个字节的含义如下:
- size 2字节
扩展区的数据长度 ,可以为0或22 - valid_bits_per_sample 2字节
有效的采样位数,最大值为采样字节数 * 8。可以使用更灵活的量化位数,通常音频sample的量化位数为8的倍数,但是使用了WAVE_FORMAT_EXTENSIBLE时,量化的位数有扩展区中的valid bits per sample
来描述,可以小于Format chunk中制定的bits per sample
。 - channle mask 4字节
声道掩码 - sub format 16字节
GUID,include the data format code,数据格式码。
在Format chunk中的format_tag设置为0xFFFE时,表示使用扩展区中的sub_format来决定音频的数据的编码方式。在以下几种情况下必须要使用WAVE_FORMAT_EXTENSIBLE
- PCM数据的量化位数大于16
- 音频的采样声道大于2
- 实际的量化位数不是8的倍数
- 存储顺序和播放顺序不一致,需要指定从声道顺序到声卡播放顺序的映射情况。
Data chunk
Data块中存放的是音频的采样数据。每个sample按照采样的时间顺序写入,对于使用多个字节的sample,使用小端模式存放(低位字节存放在低地址,高位字节存放在高地址)。对于多声道的sample采用交叉存放的方式。例如:立体双声道的sample存储顺序为:声道1的第一个sample,声道2的第一个sample;声道1的第二个sample,声道2的第二个sample;依次类推....。对于PCM数据,有以下两种的存储方式:
- 单声道,量化位数为8,使用偏移二进制码
- 除上面之外的,使用补码方式存储。
总结
本文主要介绍了RIFF文件的格式和WAV音频文件格式,为后面实现对WAVE文件的读写打一个理论基础。后面打算使用C++标准库,实现对WAV文件的读写。
原文:http://www.cnblogs.com/wangguchangqing/p/5957531.html
RIFF和WAVE音频文件格式相关推荐
- 音频文件的结构与规范——RIFF和WAVE音频文件格式
RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...
- 详解WAVE音频文件格式
详解WAVE音频文件格式 WAVE声音文件格式是目前Windows最直接保存声音数据的文件格式.在涉及声音信号处理时大多是对WAV文件直接操作,有必要搞清楚所研究声音的文件格式. 1 RIFF文件与W ...
- WAVE音频文件格式及其64位扩展格式的简要介绍
正文 关于 WAVE 文件格式,网上有不少介绍,但关于WAVE 64位扩展格式的介绍却是几乎没有. 所以本文的目的是简要介绍标准的 WAVE 格式,以及两种主要的扩展格式. 文中所有代码都用C语言来描 ...
- wave格式分析,wave音频文件格式分析配程序
wav文件格式分析详解 程序如上一篇博文 一.综述 WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的. RIFF是英文Resource Interchange Fil ...
- python wave音频库使用(一)
image.png 目录 python wave音频库使用(一)python wave音频库使用(二) wave wave主要作用是操作WAV格式文件. 什么是WAV格式文件? WAV是最常见的声音文 ...
- RIFF和WAVE文件格式
RIFF RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文件所包含的数据类型由该文 ...
- wav音频文件格式解析
wav是微软开发的一种音频文件格式,注意,wav文件格式是无损音频文件格式,相对于其他音频格式文件数据是没有经过压缩的,通常文件也相对比较大些. 文件格式如图所示: 解析代码如下: #include ...
- WAVE音频格式及及转换代码
音频信号的读写.播放及录音 python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudio(http://people.csail.mit.edu/hubert/pyaudio).最 ...
- Wave音频格式解析
PCM脉码调制数字音频格式是70年代末发展起来的,记录媒体之一的CD,80年代初由飞利浦和索尼公司共同推出.PCM的音频格式也被DVD-A所采用,它支持立体声和5.1环绕声,1999年由DVD讨论会发 ...
- WAVE音频文件数字信号处理——实现变声功能
WAVE音频文件 WAVE文件作为最早的数字音频文件格式之一,是应用于windows平台的波形音频文件.它是一种无损的音频文件,具有较好音质,缺点是占用大量存储空间.之后WAVE文件从无压缩编码形式P ...
最新文章
- POJ 2391 Ombrophobic Bovines 网络流 建模
- 生产环境下,oracle不同用户间的数据迁移。第一部分
- isql导出表到文本
- git rm -r --cached 去掉已经托管在git上的文件
- vue django mysql_django2 rest_framework + vue.js + mysql5.6 实现增删改查
- 韩顺平php视频笔记46 函数入门
- 织梦++高级搜索php,织梦高级搜索页面advancedsearch.php调用自定义字段
- 如何使用Python进行时间序列预测的基线预测
- Electron 应用实战 (架构篇)
- 快闪ppt音乐_冬日午后南昌路,音乐快闪引人驻足
- (转) Csrss进程剖析
- 豆瓣电影爬虫Ⅱ 豆瓣电影数据的整理
- 2017年全国大学生电子设计竞赛报告(F题)调幅信号处理实验电路
- 基于Web的动态新闻发布系统设计与实现(含word文档)
- 弹出visual studio 实时调试器解决
- 奶酪和奶酪碎的区别_与奶酪三星银河芽战斗大逃杀直播vs airpods
- SpringCloud(3)——SpringDataJpa之EntityManager的CRUD
- 判断日期是否合法(Java精练版)
- 案例精选 | 冷饭变盛宴?一文谈尽边缘计算
- python 堆叠柱状图 多列 复杂_[Python Study Notes]堆叠柱状图绘制
热门文章
- 中文编码--中国程序员之”银弹“?
- 修改后的LOGO发布(确定稿)
- css的部分应用示例
- Swift3.0服务端开发(二) 静态文件添加、路由配置以及表单提交
- iOS 使用pods报错问题 pod --version
- android状态栏自定义,如何自定义Android状态栏颜色
- 如何判断两物体加速度相等_高中物理知识点总结解题技巧:关联物体问题的求解方法...
- MySQL增量备份恢复和基于时间点与位置的恢复
- EXCHANGE清除可恢复项目文件夹(就地电子数据展示和保留)
- python windows 远程执行bat