`
weiyuhu
  • 浏览: 235876 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

WAV文件结构解析

阅读更多
前两天在公司做了个wav文件的播放器和波形显示的东东,回来之后忽然想起一直没有做过总结,趁现在还有空赶紧整理一下...

一.WAV格式文件头
1.综述:
wav文件是由四个大块构成的,按照从前到后的顺序依次为RIFF WAVE Chunk,Format Chunk,Fact Chunk(可选),Data Chunk.具体如下图所示:

------------------------------------------------
  | RIFF WAVE Chunk |
  | ID = 'RIFF' |
  | RiffType = 'WAVE' |
------------------------------------------------
  | Format Chunk |
  | ID = 'fmt ' |    (此处为四个字节,最后面一个是空格)
------------------------------------------------
       | Fact Chunk(optional) |
  | ID = 'fact' |
------------------------------------------------
  | Data Chunk |
  | ID = 'data' |
------------------------------------------------
除了Fact Chunk外,其他三个Chunk都是必须的,并且都有自己的ID,放在块的开始位置,后面紧跟的四个字节是本块所占的大小(出去ID和Size本身所占的四个字节),低字节表示地位,高字节表示高位...

2.详细介绍:
①RIFF WAVE Chunk
  ==================================
  | |所占字节数| 具体内容 |
  ==================================
  | ID | 4 Bytes | 'RIFF' |
  ----------------------------------
  | Size | 4 Bytes | |
  ----------------------------------
  | Type | 4 Bytes | 'WAVE' |
  ----------------------------------
以RIFF作为标识,后面紧跟size,该size的大小是整个WAVE文件大小减去8个字节,然后是Type字段,为"WAVE"表示是Wav文件,结构体定义如下:

struct RIFF_HEADER
     {
  char szRiffID[4]; // 'R','I','F','F'
  DWORD dwRiffSize;
  char szRiffFormat[4]; // 'W','A','V','E'
  };

②Format Chunk
  ====================================================================
  | | 字节数 | 具体内容 |
  ====================================================================
  | ID | 4 Bytes | 'fmt ' |
  --------------------------------------------------------------------
  | Size | 4 Bytes | 数值为16或18,18则最后又附加信息 |
  -------------------------------------------------------------------- ----
  | FormatTag | 2 Bytes | 编码方式,一般为0x0001 | |
  -------------------------------------------------------------------- |
  | Channels | 2 Bytes | 声道数目,1--单声道;2--双声道 | |
  -------------------------------------------------------------------- |
  | SamplesPerSec | 4 Bytes | 采样频率 | |
  -------------------------------------------------------------------- |
  | AvgBytesPerSec| 4 Bytes | 每秒所需字节数 | |===> WAVE_FORMAT
  -------------------------------------------------------------------- |
  | BlockAlign | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) | |
  -------------------------------------------------------------------- |
  | BitsPerSample | 2 Bytes | 每个采样需要的bit数 | |
  -------------------------------------------------------------------- |
  | | 2 Bytes | 附加信息(可选,通过Size来判断有无) | |
  -------------------------------------------------------------------- ----
以"fmt "作为标识,一般长度为16个字节,如果是18个字节则有附加信息,写在最后两个字节上,定义结构体如下:

struct WAVE_FORMAT
  {
  WORD wFormatTag;
  WORD wChannels;
  DWORD dwSamplesPerSec;
  DWORD dwAvgBytesPerSec;
  WORD wBlockAlign;
  WORD wBitsPerSample;
  };
  struct FMT_BLOCK
  {
  char szFmtID[4]; // 'f','m','t',' '
  DWORD dwFmtSize;
  WAVE_FORMAT wavFormat;
  };

③Fact Chunk(可选字段)
  ==================================
  | |所占字节数| 具体内容 |
  ==================================
  | ID | 4 Bytes | 'fact' |
  ----------------------------------
  | Size | 4 Bytes | 数值为4 |
  ----------------------------------
  | data | 4 Bytes | |
  ----------------------------------
在标准WAVE文件中是可有可无的字段,一般当wav文件是某些软件合成的话则包含该字段.定义结构体如下:

struct FACT_BLOCK
  {
  char szFactID[4]; // 'f','a','c','t'
  DWORD dwFactSize;
  };
PS:数据区域不在头部的定义当中...

⑤Data Chunk
  ==================================
  | |所占字节数| 具体内容 |
  ==================================
  | ID | 4 Bytes | 'data' |
  ----------------------------------
  | Size | 4 Bytes | |
  ----------------------------------
  | data | | |
  ----------------------------------
这是真正存储语音数据的地方,以"data"为标识,Size是数据区域的大小,紧接着就是语音数据.定义结构体如下:

struct DATA_BLOCK
  {
  char szDataID[4]; // 'd','a','t','a'
  DWORD dwDataSize;
  };
根据Format Chunk里面声道数和位数的大小,读取WAVE数据时候还要看具体的内容,总之数据区不管由几个字节表示一个采样点,都是地位表示低字节,高位表示高字节...

二.波形表示

①数据密集时候表示波形算法:

数据很密集的情况下,在一个区域内有很多个点,这些点肯定可以连成一条线,在这种情况下,取这段区域的最大值和最小值然后用平滑曲线连接起来,就可以得到大体的波形了...

②数据疏散时候表示波形:

在屏幕上画出每个点的位置,然后用GDI的平滑曲线函数连接各个点,就可得到类似Adobe Audition的显示波形

③每个采样点和屏幕位置的对应:

我只试着处理了8位和16位单声道的数据,现说明如下:

8位采样的用short型的变量存储的话范围就是0-255,0表示屏幕的最上端,而255表示屏幕的最下端,所以就可以用rect.bottom - perData*rect.Height()/255来计算屏幕点的位置了...

16位采样的用short型变量存储就会出现溢出,但是恰好可以利用它的溢出来解决问题,由于16位的unsigned 类型表示范围是0-65535,所以用short存储的时候就会出现范围是-32767到32768之间其中负值表示屏幕中线以上的数据,而正值是屏幕中线以下的位置所以计算公式改为:

rect.top + rect.Height()/2 + perData*rect.Height()/65535

画出曲线来基本和Adobe Audition画出的波形类似...
分享到:
评论

相关推荐

    wav文件的创建

    #### WAV文件结构解析 WAV文件的基本结构可以分为两个主要部分:文件头和数据区。 - **文件头**:包含了关于WAV文件的重要元数据,如文件类型、采样率、通道数等。 - **数据区**:存储了实际的音频数据。 #### ...

    wav文件解析,STM32解析wav文件

    在本文中,我们将深入探讨如何在STM32微控制器上解析WAV文件并实现双缓存机制来流畅地播放音乐。WAV文件是一种常见的无损音频格式,它包含原始的PCM(脉冲编码调制)数据,这使得WAV文件在处理音频数据时具有较高的...

    wav文件格式详解

    #### 二、WAV文件结构 WAV文件主要由两大部分组成:**文件头**和**数据体**。 ##### 1. 文件头 文件头包括以下两个部分: - **RIFF/WAV文件标识段** - **前四个字节**:“RIFF”,表明这是一个WAVE文件头。 - ...

    WAV文件格式(用于解析WAV文件)

    1. WAV文件结构: WAV文件的头部包含RIFF chunk,它定义了整个文件的基本信息。RIFF chunk中又包含了'WAVE'标识,表明这是一个WAV文件。接下来是两个重要的子chunk:'fmt '和'data'。 - 'fmt ' chunk:这个子...

    WAV 文件格式解析

    ### WAV文件格式解析 #### 一、WAV文件概述 WAV文件是Windows环境中非常流行的音频文件格式,常用于存储声音数据。它以其兼容性和高质量而闻名,支持多种压缩方式和采样率,使得该格式既能够保持较高的音质,也能...

    C读取wav文件

    #### WAV文件结构详解 WAV文件由一系列的块组成,主要包括以下几个关键块: 1. **RIFF WAVE Chunk**:这是WAV文件的主块,包含了其他所有块的信息。 2. **Format Chunk**:描述了音频的具体格式信息,如采样率、...

    WAV文件详解及实例分析

    本文将对 WAV 文件进行详细解析,并对其结构和组成进行实例分析。 WAV 文件的结构主要由文件头、音频数据和文件尾三部分组成。文件头部分主要包含文件的基本信息,如文件类型、文件长度、音频参数等;音频数据部分...

    wav文件格式解析

    WAV文件结构 WAV文件基于RIFF(Resource Interchange File Format)文件格式,它由一系列的块(chunks)组成。主要包含以下部分: - **RIFF Chunk**: 文件的开头,标识这是一个RIFF文件,并包含整个文件的大小。 ...

    wav文件的解析类和wav文件播放类

    WAV文件的结构主要包括RIFF头、fmt chunk、data chunk等部分。`WaveFile`类可能包含如下功能: 1. 打开并读取WAV文件,验证RIFF头和fmt chunk,确保文件的正确性。 2. 解析文件头信息,如采样率、位深度、通道数等...

    fft的vc模拟以及wav文件的波形解析

    对于WAV文件解析,我们需要理解其文件结构。WAV文件的头部包含RIFF块,其中包含了“WAVE”标识符,接着是fmt 和data块。fmt 块存储了音频的格式信息,如采样率、位深度和声道数等。data块则包含了实际的音频样本数据...

    wav音频文件结构说明

    为了更直观地理解WAV文件结构,以下是一个简化的WAV文件结构示例: 1. **RIFF块** - “RIFF”(4字节) - 文件大小(4字节) - “WAVE”(4字节) 2. **“fmt ”块** - “fmt ”(4字节) - 数据大小(4字节...

    8,WAV文件格式说明_wav_wav文件格式说明_

    **WAV文件格式详解** WAV,全称Waveform Audio File Format,是由Microsoft和IBM共同开发的一种声音文件格式,属于Resource Interchange File Format (RIFF) 文件格式家族的一部分。它是未压缩的音频文件格式,因此...

    wav文件写操作

    WAV文件结构 .wav文件基于Resource Interchange File Format (RIFF) 格式,其基本结构由以下部分组成: - **RIFF头部**: 文件以"RIFF"标识开始,接着是4字节的文件大小(不包括"RIFF"和"fmt "),然后是文件类型...

    wav文件解析

    WAV文件结构 一个WAV文件主要由以下几个部分组成: - **RIFF头**: 文件起始处的4个字节标识符"RIFF",后面紧跟32位的文件大小(不包括RIFF头的前8个字节),以及文件类型标识"WAVE"。 - **fmt 部分**: 描述音频...

    Android 音频开发-如何存储和解析wav文件

    首先,让我们了解WAV文件的基本结构。WAV文件由一个文件头(RIFF header)和数据块组成。文件头包含文件类型标识、文件大小、子格式信息等,而数据块则存储实际的音频样本。解析WAV文件时,我们需要读取并理解这些...

    用C语言实现wav文件的读取

    在IT领域,音频处理是重要的...总结,使用C语言实现wav文件的读取涉及到理解wav文件的结构,使用标准库中的文件I/O函数,以及解析二进制数据的能力。通过实践和学习,可以掌握这一技术,为音频处理项目打下坚实的基础。

    QT实现wav音频文件读写

    在读取PCM数据时,我们首先需要解析WAV文件头,然后读取音频数据部分,将这些数据存储到内存中。相反,写入WAV文件则需要先创建一个符合WAV文件规范的文件头,再将PCM数据写入文件。 在QT中,可以使用`QDataStream`...

    wav格式解析

    在处理WAV文件时,开发者可以利用微软提供的相关函数来读取和解析这种文件结构。这种结构允许不同类型的数据被组织成有序的块,从而使得文件更加容易被解析和操作。WAV文件由于其结构简单和非压缩的特性,常被用于...

    C++读取WAV格式音频文件

    首先,理解WAV文件的结构至关重要。WAV文件由一系列的块(chunks)组成,主要包含以下部分: 1. **RIFF头**: "RIFF"四个字节标识这是一个RIFF文件,接着是4字节的文件大小(不包括RIFF头的8字节),然后是"WAVE",...

Global site tag (gtag.js) - Google Analytics