iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解RIFF和WAVE音频文件格式
  • 518
分享到

详解RIFF和WAVE音频文件格式

2024-04-02 19:04:59 518人浏览 泡泡鱼
摘要

RIFF file fORMat RIFF全称为资源互换文件格式(Resources Interchange File Format),是windows下大部分多媒体文件遵循的一种文

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。

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
  • 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字节,具体介绍,后面补充。

  • Fact chunk(option)
  • id
  • FOURCC 值为 'f' 'a' 'c' 't'
  • size
  • 数据域的长度,4(最小值为4)
  • 采样总数 4字节
  • Data chunk
  • id

FOURCC 值为'd' 'a' 't' 'a'

  • size

数据域的长度

  • data

具体的音频数据存放在这里

采用压缩编码的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文件的读写。

到此这篇关于RIFF和WAVE音频文件格式的文章就介绍到这了,更多相关RIFF和WAVE音频格式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解RIFF和WAVE音频文件格式

本文链接: https://www.lsjlt.com/news/163850.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解RIFF和WAVE音频文件格式
    RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文...
    99+
    2024-04-02
  • 音频文件格式有哪些
    音频文件格式常见有6种:1、MP3,应用于音乐播放器、手机等设备;2、WAV,用于存储未经压缩的音频;3、FLAC,适用于需要保留音频质量又要节省存储空间的需求;4、AAC,用于移动设备、音乐流媒体和互联网广播;5、OGG,开放的音频格式;...
    99+
    2023-08-15
  • PHP怎么将amr音频文件转换为mp3格式
    这篇文章主要介绍“PHP怎么将amr音频文件转换为mp3格式”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP怎么将amr音频文件转换为mp3格式”文章能帮助大家...
    99+
    2024-04-02
  • html5可以播放哪些格式的视频和音频
    这篇文章主要讲解了“html5可以播放哪些格式的视频和音频”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“html5可以播放哪些格式的视频和音频”吧! ...
    99+
    2024-04-02
  • Python实现批量将MP3音频转为WAV格式详解
    目录前言环境依赖代码验证一下前言 本文提供批量将MP3格式的音频转为wav格式的工具代码,一如既往的实用主义。 环境依赖 ffmpeg环境安装,可以参考:windows ffmpeg...
    99+
    2024-04-02
  • 怎么使多浏览器播放wav格式的音频文件
    这篇文章主要介绍“怎么使多浏览器播放wav格式的音频文件”,在日常操作中,相信很多人在怎么使多浏览器播放wav格式的音频文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使多浏览器播放wav格式的音频文件...
    99+
    2023-06-04
  • json文件书写格式详解
    目录 JSON是什么为什么有这个技术JSON 如何使用- 数据格式- 注意事项- JS 内置两个Json方法实例: JSON是什么 JSON ( JavaScript Object ...
    99+
    2024-04-02
  • C# 基于NAudio实现对Wav音频文件剪切(限PCM格式)
    目录前言实现代码效果图前言 C#基于NAudio工具对Wav音频文件进行剪切,将一个音频文件剪切成多个音频文件 注:调用方法前需要导入NAudio.dll或者在NuGet程序管理器搜...
    99+
    2024-04-02
  • 一文详解WebAudi绘制音频图谱
    目录背景实现思路获取音频文件利用Web Audio Api 处理音频数据通过解码后的音频数据,绘制波形图背景 前端处理音频,目前一些开源的插件和js库已经提供了非常好的支持。其中小...
    99+
    2023-03-09
    Web Audio绘制音频图谱 Web Audio
  • Android开发基础实现音频文件的播放详解
    目录前言实现方法最终效果总结前言 上一篇(安卓开发基础——实现最简单的视频播放我们简单的实现了一个播放视频的功能,这一节我们来实现App对音频文件的播放功能...
    99+
    2023-02-06
    Android开发音频文件播放 Android 音频播放
  • Win10把文件转为PDF格式详解
      Win10 10036泄露出来,用户惊喜地发现,新增了一个功能,可以把文件转换为PDF格式,而且操作起来很容易。这项功能是Win10原生支持的,Win7、Win8系统里需要第三方软件支持。   在任意文件上点击右键...
    99+
    2023-06-12
    Win10 PDF 文件 格式
  • Python中怎么将音频内容转换为文本格式
    这篇文章将为大家详细讲解有关Python中怎么将音频内容转换为文本格式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。搭建开发环境转到保存Python虚拟环境的目录。我将我的目录保存在用户主目...
    99+
    2023-06-16
  • python PyVCF文件处理VCF文件格式实例详解
    目录引言PyVCF库的安装PyVCF库的导入PyVCF库详细介绍使用实例:_Record对象------位点信息的储存形式Reader对象------处理vcf文件,构建结构化信息综...
    99+
    2024-04-02
  • Golang与FFmpeg: 如何实现音频格式转换和压缩
    在Golang中,可以使用FFmpeg库来实现音频格式转换和压缩。FFmpeg是一个开源的多媒体处理工具,可以处理音频、视频等多种格...
    99+
    2023-10-08
    Golang
  • Python文件操作和数据格式详解(简单简洁)
    目录一、文件操作1、文件的基本操作2、读文件3、写文件4.os模块的使用二、JSON总结一、文件操作 前言: 什么是计算机的流 "流"指的是在不同的输入/输出等设...
    99+
    2024-04-02
  • Golang与FFmpeg: 如何实现音频格式转换和合并
    要使用Golang和FFmpeg来实现音频格式转换和合并,你需要安装FFmpeg并确保它可以在命令行中正常运行。然后,你可以使用Go...
    99+
    2023-10-20
    Golang
  • Golang与FFmpeg: 如何实现音频格式转换和降噪
    要实现音频格式转换和降噪,可以使用Golang与FFmpeg结合的方式。首先,确保已经安装了FFmpeg并且将其添加到系统的环境变量...
    99+
    2023-10-20
    Golang
  • Thinkphp5实现图片、音频和视频文件的上传功能
    本篇文章为大家展示了Thinkphp5实现图片、音频和视频文件的上传功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先是同步上传,最为基础的上传的方式,点击表单提交之后跳转那种。<!DOC...
    99+
    2023-06-15
  • 多格式视频音频转换一体化解决方案Cisdem Video Converter Mac
    Cisdem Video Converter Mac激活版是Mac平台上一款具有视频下载,音视频转换,视频编辑和分享的视频转换器。Cisdem Video Converter Mac激活版集视频娱乐功能于一身,您可以将视频和音频文件转换为所...
    99+
    2023-06-05
  • JAVA获取视频音频时长 文件大小 MultipartFileUtil和file转换
    java 获取视频时长_java获取视频时长_似夜晓星辰的博客-CSDN博客 ws.schild jave-all-deps 2.5.1 @Slf4...
    99+
    2023-10-08
    java python 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作