一. RIFF概念

在Windows环境下,大部分的多媒体文件都依循着一种结构来存放信息,这样的结构称为"资源互换文件格式"(Resources lnterchange File Format),简称RIFF。比如声音的WAV文件、视频的AV1文件等等均是由此结构衍生出来的。RIFF能够看做是一种树状结构,其基本构成单位为chunk,宛如树状结构中的节点,每一个chunk由"辨别码"、"数据大小"及"数据"所组成。

块的标志符(4BYTES)

数据大小 (4BYTES)

数据

图一、 块的结构示意图

辨别码由4个ASCII码所构成,数据大小则标示出紧跟其后数据的长度(单位为Byte),而数据大小本身也用掉4个Byte,所以其实一个chunk的长度为数据大小加8。一般而言,chunk本身并不同意内部再包括chunk,但有两种例外,分别为以"RIFF"及"L1ST"为辨别码的chunk。而针对此两种chunk,RIFF又从原先的"数据"中切出4个Byte。 此4个Byte称为"格式辨别码",然而RIFF又规定文件里仅能有一个以"RIFF"为辨别码的chunk。

RIFF/LIST标志符

数据1大小

数据1

格式/列表类型

数据

图二、RIFF/LIST块结构

仅仅要依循此一结构的文件,我们均称之为RIFF档。此种结构提供了一种系统化的分类。假设和MS一DOS文件系统作比較,"RIFF"chunk就好比是一台硬盘的根文件夹,其格式辨别码便是此硬盘的逻辑代码(C:或D:),而"L1ST"chunk即为其下的子文件夹,其它的chunk则为一般的文件。至于在RIFF文件的处理方面,微软提供了相关的函数。视窗下的各种多媒体文件格式就如同在磁盘机下规定仅能放如何的文件夹,而在该文件夹下仅能放何种数据。

二. WAV文件格式

WAVE文件是很easy的一种RIFF文件,它的格式类型为"WAVE"。RIFF块包括两个子块,这两个子块的ID各自是"fmt"和"data",当中"fmt"子块由结构PCMWAVEFORMAT所组成,其子块的大小就是sizeofof(PCMWAVEFORMAT),数据组成就是PCMWAVEFORMAT结构中的数据。

标志符(RIFF)

数据大小

格式类型("WAVE")

"fmt"

Sizeof(PCMWAVEFORMAT)

PCMWAVEFORMAT

"data"

声音数据大小

声音数据

图三、WAVE文件结构

PCMWAVEFORMAT结构定义例如以下:

Typedef
struct

...{

     WAVEFORMAT wf;       
/波形格式;

     WORD wBitsPerSample;   
//WAVE文件的採样大小;

}
PCMWAVEFORMAT;



//WAVEFORMAT结构定义例如以下:

typedef
struct

...{

     WORD wFormatag;       
//编码格式,包含WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等

     WORD nChannls;       
//声道数,单声道为1,双声道为2;

     DWORD nSamplesPerSec;   
//採样频率;

     DWORD nAvgBytesperSec;   
//每秒的数据量;

      WORD nBlockAlign;       
//块对齐;

}
WAVEFORMAT;

"data"子块包括WAVE文件的数字化波形声音数据,其存放格式依赖于"fmt"子块中wFormatTag成员指定的格式种类,在多声道WAVE文件里,样本是交替出现的。如16bit的单声道WAVE文件和双声道WAVE文件的数据採样格式分别如图四所看到的:

16位单声道:

採样一

採样二

……

低字节

高字节

低字节

高字节

……

16位双声道:

採样一

……

左声道

右声道

……

低字节

高字节

低字节

高字节

……

图四、WAVE文件数据採样格式

WAV文件格式实例分析:

0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F

00000000H

00000010H

00000020H

00000030H

00000040H

52  49  46  46  0A 06  01  00  57  41  56  45  66  6D 74  20

12  00  00  00  01  00  02  00  44  AC 00 00  10  B1  02  00

04  00  10  00  00  00  66  61  63  74  04  00  00  00  76  41

00  00  64  61  74  61  D8  05  01  00 00  00  00  00  FF  FF

00  00  FE FF FE FF  00  00  00  00 FE  FF FE FF  00  00

偏移地址

字节数

数据类型

内容

文件头

00H

char

“RIFF”;  
RIFF标志

04H

long int

0x00 01 06 0A(注意数据存储顺序);  
文件长度

08H

char

“WAVE”;  
WAVE标志

0CH

char

“fmt ”;  
fmt标志,最后一位为空

10H

long int

0x12;  
sizeof(PCMWAVEFORMAT)

14H

int

(WAVE_FORMAT_PCM); 
表示为PCM形式的声音数据

16H

int

2;

18H

int

44100; 
採样频率(每秒样本数)

1CH

long int

0x10B10000;  
。播放软件利用此值能够预计缓冲区的大小。

20H

int

。播放软件须要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。

22H

每样本的数据位数,表示每一个声道中各个样本的数据位数。假设有多个声道,对每一个声道而言,样本大小都一样。

50H

char

“data”;  
数据标记符

54H

long int

0x00 01 05 D8;  
语音数据大小

WAV文件格式分析的更多相关文章

  1. wav文件格式分析详解

    wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述    WAVE文件作为多媒体中使用的声波文件格式 ...

  2. wav文件格式分析与详解

    WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形, ...

  3. 【转载】wav文件格式分析与详解

    WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形, ...

  4. wav文件格式分析(二)

    (三)格式分析 WAVE文件是由若干个Chunk组成的.按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk. ...

  5. wav文件格式分析(一)

    (一)概述 WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范: (二)音频知识 1.常见的声音文 ...

  6. wav文件格式分析(三)

    (四)附表 1.头格式表: 2.PCM数据的存放方式 3.PCM波形样本的数据格式 WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数. 首先存储低有效字节,表示样 ...

  7. WAV文件格式解析及处理

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

  8. wav文件格式及ffmpeg处理命令

    wav文件头详解 符合RIFF(Resource Interchange File Format)规范的wav文件的文件头记录了音频流的编码参数等基本信息.wav文件由多个块组成,至少包含RIFF标志 ...

  9. WAV文件格式

    作者:阿宝 更新:2016-09-21 来源:彩色世界(https://blog.hz601.org/2016/09/21/waveform-audio-file-format/index.html) ...

随机推荐

  1. Machine Learning - Lecture 16

    Reinforcement Learning (R.L.) ① MDPs (Markov Decision Processes) ② Value Functions ③ Value Iteration ...

  2. TI芯片android环境搭建和编译

    1>. Reading package lists... Done Building dependency tree        Reading state information... Do ...

  3. 部分和问题(dfs)

    部分和问题 时间限制:1000 ms  |           内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. ...

  4. linux内存操作----kernel 3.5.X copy_from_user()和copy_to_user()

    前面的一篇文章中简单的描写叙述了一下内存映射的内容,http://blog.csdn.net/codectq/article/details/25658813,这篇文章作为用户把内存规划好之后,在用户 ...

  5. Zero Downtime Upgrade of Oracle 10g to Oracle 11g Using GoldenGate — 2

    Prepare 10g Database for OGG Create GGS and GGS_MON Database Users SQL> create tablespace ggs_tbs ...

  6. CSDN-Markdown语法集锦

    前言: 使用Markdown近一个来月.越来越认为不舒爽. 改字体.改字号.改颜色.改样式,全不会!想加个数学公式.得,仅仅会截图.把图片传上去了还不会控制大小.也不会控制文字与图片的排版,写出来的博 ...

  7. Winform单例模式与传值

    单例模式(singleton)的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 在多窗体界面中,如果要加入一个“关于”的窗体,用于显 ...

  8. Foundation--NSDictionary+NSMutableDictionary

    键值对 key(一般为字符串对象)---vaule(必须是对象) Person *p1 =[[Person alloc ]init]; Person *p2 =[[Person alloc ]init ...

  9. 地图:CLGeocoder地址解析与反地址解析

    1.导入系统框架

  10. 理解ThreadLocal(一)

    早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. Th ...