前两天在公司做了个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文件的重要元数据,如文件类型、采样率、通道数等。 - **数据区**:存储了实际的音频数据。 #### ...
在本文中,我们将深入探讨如何在STM32微控制器上解析WAV文件并实现双缓存机制来流畅地播放音乐。WAV文件是一种常见的无损音频格式,它包含原始的PCM(脉冲编码调制)数据,这使得WAV文件在处理音频数据时具有较高的...
#### 二、WAV文件结构 WAV文件主要由两大部分组成:**文件头**和**数据体**。 ##### 1. 文件头 文件头包括以下两个部分: - **RIFF/WAV文件标识段** - **前四个字节**:“RIFF”,表明这是一个WAVE文件头。 - ...
1. WAV文件结构: WAV文件的头部包含RIFF chunk,它定义了整个文件的基本信息。RIFF chunk中又包含了'WAVE'标识,表明这是一个WAV文件。接下来是两个重要的子chunk:'fmt '和'data'。 - 'fmt ' chunk:这个子...
### WAV文件格式解析 #### 一、WAV文件概述 WAV文件是Windows环境中非常流行的音频文件格式,常用于存储声音数据。它以其兼容性和高质量而闻名,支持多种压缩方式和采样率,使得该格式既能够保持较高的音质,也能...
#### WAV文件结构详解 WAV文件由一系列的块组成,主要包括以下几个关键块: 1. **RIFF WAVE Chunk**:这是WAV文件的主块,包含了其他所有块的信息。 2. **Format Chunk**:描述了音频的具体格式信息,如采样率、...
本文将对 WAV 文件进行详细解析,并对其结构和组成进行实例分析。 WAV 文件的结构主要由文件头、音频数据和文件尾三部分组成。文件头部分主要包含文件的基本信息,如文件类型、文件长度、音频参数等;音频数据部分...
WAV文件结构 WAV文件基于RIFF(Resource Interchange File Format)文件格式,它由一系列的块(chunks)组成。主要包含以下部分: - **RIFF Chunk**: 文件的开头,标识这是一个RIFF文件,并包含整个文件的大小。 ...
WAV文件的结构主要包括RIFF头、fmt chunk、data chunk等部分。`WaveFile`类可能包含如下功能: 1. 打开并读取WAV文件,验证RIFF头和fmt chunk,确保文件的正确性。 2. 解析文件头信息,如采样率、位深度、通道数等...
对于WAV文件解析,我们需要理解其文件结构。WAV文件的头部包含RIFF块,其中包含了“WAVE”标识符,接着是fmt 和data块。fmt 块存储了音频的格式信息,如采样率、位深度和声道数等。data块则包含了实际的音频样本数据...
为了更直观地理解WAV文件结构,以下是一个简化的WAV文件结构示例: 1. **RIFF块** - “RIFF”(4字节) - 文件大小(4字节) - “WAVE”(4字节) 2. **“fmt ”块** - “fmt ”(4字节) - 数据大小(4字节...
**WAV文件格式详解** WAV,全称Waveform Audio File Format,是由Microsoft和IBM共同开发的一种声音文件格式,属于Resource Interchange File Format (RIFF) 文件格式家族的一部分。它是未压缩的音频文件格式,因此...
WAV文件结构 .wav文件基于Resource Interchange File Format (RIFF) 格式,其基本结构由以下部分组成: - **RIFF头部**: 文件以"RIFF"标识开始,接着是4字节的文件大小(不包括"RIFF"和"fmt "),然后是文件类型...
WAV文件结构 一个WAV文件主要由以下几个部分组成: - **RIFF头**: 文件起始处的4个字节标识符"RIFF",后面紧跟32位的文件大小(不包括RIFF头的前8个字节),以及文件类型标识"WAVE"。 - **fmt 部分**: 描述音频...
首先,让我们了解WAV文件的基本结构。WAV文件由一个文件头(RIFF header)和数据块组成。文件头包含文件类型标识、文件大小、子格式信息等,而数据块则存储实际的音频样本。解析WAV文件时,我们需要读取并理解这些...
在IT领域,音频处理是重要的...总结,使用C语言实现wav文件的读取涉及到理解wav文件的结构,使用标准库中的文件I/O函数,以及解析二进制数据的能力。通过实践和学习,可以掌握这一技术,为音频处理项目打下坚实的基础。
在读取PCM数据时,我们首先需要解析WAV文件头,然后读取音频数据部分,将这些数据存储到内存中。相反,写入WAV文件则需要先创建一个符合WAV文件规范的文件头,再将PCM数据写入文件。 在QT中,可以使用`QDataStream`...
在处理WAV文件时,开发者可以利用微软提供的相关函数来读取和解析这种文件结构。这种结构允许不同类型的数据被组织成有序的块,从而使得文件更加容易被解析和操作。WAV文件由于其结构简单和非压缩的特性,常被用于...
首先,理解WAV文件的结构至关重要。WAV文件由一系列的块(chunks)组成,主要包含以下部分: 1. **RIFF头**: "RIFF"四个字节标识这是一个RIFF文件,接着是4字节的文件大小(不包括RIFF头的8字节),然后是"WAVE",...