欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

带您分析 wav 音频文件的结构(示例 + 代码)--引自参考文献 1RIFF 文件分析

最编程 2024-05-02 16:57:29
...

RIFF是Microsoft提出的一种多媒体文件的存储方式,不同编码的音频、视频文件,可以按照它定义的存储规则来保存、记录各自不同的数据,如:数据内容、采样信息、视窗大小、编码方式等。在播放器或者其他提取工具读取文件的时候,就可以根据RIFF的规则来分析文件,合理的解析出音频、视频信息,正确的播放它们。在现实中,常见的这类文件有WAV文件、AVI文件。它们都是遵循RIFF的方式保存自己的播放信息和播放数据的。

在RIFF的文件存储规则中,主要有几个重要的概念需要理解。它们是FOURCC、RIFF文件头、CHUNK、LIST。RIFF的组成元素就是它们,分析一个按RIFF规则组织的文件,都可以把它划分成CHUNK、LIST、RIFF这几个部分。

RIFF的数据存储形式是一种仿Microsoft文件系统的组织形式。在一个Microsoft的文件系统中,有盘符、目录、文件的概念。系统可以有几个盘符,每个盘符又可以有多个目录,在目录的下面则可以有子目录或是许多的文件。文件是保存数据的基本单元,而盘符目录是用来组织文件的。在RIFF的组织中,也借用了这些思想。在RIFF文件中,数据保存的基本单元是CHUNK,相当于Microsoft中的文件用他来保存一个一个代表实际意义的数据块。多个CHUNK可以用一个LIST组织起来。LIST相当于Microsoft中的目录。一个目录下面可以存放多个文件、子目录。同样,在一个LIST下面可以有几个CHUNK文件或子LIST。而多个CHUNK、LIST又由一个“RIFF头”来统领。在“RIFF头”中记录一个RIFF文件的各种信息。相当于Microsoft中的盘符。

FOURCC

一个FOURCC(four-character code)是一个占32位四个字节的数据,一般表示为4个ASCII字符。例如:一个FOURCC“abcd”在系统中就表示为 “x64636261”。FOURCC可以包括空格,所以“abc ”也是一个有效的FOURCC,在RIFF文件格式中,用FOURCC代码来标识数据流的格式、数据块的含义及其他信息。

1)一个CHUNK数据块的数据结构如下:

Chunkid chunkSize  ChunkData

Chunkid是一个FOURCC,表示这个CHUNK记录的是那些内容,相似与Microsoft中的文件名,ChunkSize占用4字节,表示这个CHUNK中数据内容的大小。ChunkData则是这个CHUNK中实质性的东西,保存CHUNK的具体数据内容。一个CHUNK保存的数据可以是关于声音文件的编码方式、音频采样等信息。也可以是声音文件的声音数据。具体表示的是哪类数据则通过CHUNKID来标识。

2)一个List数据块的数据结构如下:

“LIST“ listSize listType listData

在这里,“LIST”也是一个FOURCC,而且是固定的,每个LIST都是以“list”为开头,标识它是一个LIST,就像在Microsoft文件系统中有一个标志来标识 目录一样。ListType则是这个“目录”的名字,要求是一个FOURCC。listSize占有4字节,表示这个“目录”下保存的数据有多大。而listData则是这个目录下保存的数据,由chunk和list来组成,它们的个数和组成次序是可以不确定的。注意,listSize的值是listType的大小(即4个字节)加上listData的长度。不包括“LIST”和listSize的长度。

3)RIFF文件头是数据结构如下:

“RIFF” fileSize fileType fileData

这里,“RIFF”是一个字符串,也是一个FOURCC,表示是一个RIFF格式文件。fileSize是一个4个字节的数据,给出文件的大小。fileType是一个FOURCC的数据,用来说明的文件类型,如:“WAV”、“AVI”等(WAV、AVI文件都是基于RIFF的文件格式的)。请注意,fileSize表示的文件大小,是不包括“RIFF”和它自己所占的8个字节的,是RIFF文件头后面跟的数据大小再加上fileType的4个字节。FileData部分是用来保存他统领的内容的,可以是LIST也可以是CHUNK。