声音(WAV)文件的解读
PCM编码与Waveform音频文件(.wav)格式详解
PCM编码与Waveform⾳频⽂件(.wav)格式详解 ⼤家好,我是痞⼦衡,是正经搞技术的痞⼦。
今天痞⼦衡给⼤家介绍的是PCM编码及Waveform⾳频⽂件格式。
嵌⼊式⾥有时候也会和⾳频打交道,⽐如最近特别⽕的智能⾳箱产品,离不开前端的⾳频信号采集、降噪,中间的语⾳识别(ASR)、⾃然语⾔处理(NLP),以及后端的⽂语合成(TTS)、⾳频播放。
⾳频信号采集是处理声⾳的第⼀步,要采集⾳频就离不开PCM编码,⾳频采集完成⾃然需要保存,waveform格式(.wav)是⼀种最经典的⾳频⽂件格式。
今天痞⼦衡就给⼤家详细介绍PCM编码以及waveform⽂件格式。
⼀、声⾳基础 众所周知,声⾳是由物体振动产⽣的声波,声⾳通过介质(空⽓或固体、液体)传播并能被⼈听觉器官所感知。
发⾳物体情况(材料,距离,振动强度等)不同,产⽣的声⾳也不同。
为了区分不同的声⾳,我们主要⽤如下三个参数来描述声⾳的特征:⾳量:⼈主观上感觉到的声⾳⼤⼩(也叫响度),由“振幅”(amplitude)和⼈离声源的距离决定。
⾳调:声⾳的⾼低(⾼⾳、低⾳),由“频率”(frequency)决定,频率越⾼⾳调越⾼。
⾳⾊:⾳⾊是⼀种抽象的东西,波形决定了声⾳的⾳⾊。
声⾳因不同发声物体材料⽽具有不同特性,波形是把这个抽象特性直观的表现出来。
典型的⾳⾊波形有⽅波,锯齿波,正弦波,脉冲波等。
三⼤参数⾥除了⾳⾊没有度量单位外(可以认为⾳⾊是声⾳的UID,每种⾳⾊都是独⼀⽆⼆的),⾳量和⾳调均有度量单位,这意味着⾳量和⾳调是可调整的,也是声⾳之间可对⽐的特征参数。
1.1 ⾳量单位-分贝(dB) 声波是⼀种机械波(压⼒波)。
声波(空⽓质点)的连续振动,使空⽓分⼦不断交替的压缩和松弛,使⼤⽓压迅速产⽣起伏,这种⽓压的起伏部分,就称为声压。
声压的振幅表⽰质点离开平衡位置的距离,反映从波形波峰到波⾕的压⼒变化,以及波所携带的能量的多少。
声压值虽然可以反映⾳量⼤⼩,但⼈们⽇常⽣活中遇到的声⾳,若以声压值表⽰,变化范围⾮常⼤(达到六个数量级以上),并且⼈体听觉对声信号强弱刺激反应不是线形的,⽽是成对数⽐例关系。
WAV文件格式分析与详解
WAV文件格式分析与详解作者:王若钧何杉来源:《数字技术与应用》2014年第03期摘要:WAV文件格式信息是对WAV文件编程的重要依据。
揭开WAV文件格式的奥秘是开发功能强大的具有自主知识产权的语音处理软件的关键。
本文结合波形文件的基本知识,较系统地说明了WAV文件的存储原理、文件结构、WAV文件头格式、基于PCM编码的数据组织,内容全面、清楚、准确,还包含了一些新汇集的参数。
可作为开发人员的参考资料。
关键词:文件格式 WAV 编码声音中图分类号:TP311 文献标识码:A 文章编号:1007-9416(2014)03-0093-021 引言WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。
WAV文件格式简称WAV格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,经过了多次修订,可用于Windows,Macintosh,Linix等多种操作系统,详述如下。
2 波形文件的基础知识2.1 波形文件的存储过程声源发出的声波通过话筒被转换成连续变化的电信号,经过放大、抗混叠滤波后,按固定的频率进行采样,每个样本是在一个采样周期内检测到的电信号幅度值;接下来将其由模拟电信号量化为由二进制数表示的积分值;最后编码并存储为音频流数据。
有的应用为了节省存储空间,存储前,还要对采样数据先进行压缩。
2.2 WAV文件的编码编码包括了两方面内容,一是按一定格式存储数据,二是采用一定的算法压缩数据。
WAV格式对音频流的编码没有硬性规定,支持非压缩的PCM(Puls Code Modulation)脉冲编码调制格式,还支持压缩型的微软自适应差分脉冲编码调制Microsoft ADPCM(Adaptive Differential Puls Code Modulation)、国际电报联盟(International Telegraph Union)制定的语音压缩标准ITU G.711 a-law、ITU G.711-law、IMA ADPCM、ITU G.723 ADPCM (Yamaha)、GSM 6.10、ITU G.721 ADPCM编码和其它压缩算法。
WAV文件格式分析
WAV文件格式分析
WAV(PCM)文件格式是一种容器文件格式,它可以包含多种编码方式的
音频数据,但最常见的是PCM编码方式。
PCM是一种无损的音频编码方式,它将音频信号按照时序进行采样,并将每个采样值量化成离散的数字,进
而进行存储。
PCM编码方式的音频数据是最原始、最接近原始音频信号的
数据,因此在音质上具有高保真性。
文件头是WAV(PCM)文件的第一部分,用于描述整个文件的基本信息。
文件头的长度为44个字节。
它包含了文件的格式、采样率、通道数、量
化位数等信息。
其中,采样率表示每秒采样的次数,通道数表示音频数据
的通道数(例如单声道或立体声),量化位数表示每个采样值用多少位进
行表示。
附加信息部分是可选的,它可以用来存储一些附加的音频信息,如音
频标记、标题、歌手信息等。
附加信息部分的长度可以根据需要进行扩展。
然而,WAV(PCM)文件格式也存在一些不足之处。
由于PCM编码方式没
有对音频数据进行压缩处理,因此WAV(PCM)文件的尺寸相对较大,占用
存储空间较多。
另外,由于其采样率和量化位数的限制,WAV(PCM)文件格
式可能无法满足一些高质量音频的需求。
针对这些问题,人们常常使用其
他音频格式如MP3、AAC等进行压缩编码,以减小文件尺寸并提高存储和
传输效率。
总结起来,WAV(PCM)文件格式是一种常见的音频文件格式,它基于PCM编码方式进行存储和传输。
WAV(PCM)文件格式具有音质高、兼容性强
等优点,但同时也存在文件较大和存储、传输效率低的不足之处。
wave文件(.wav)格式、PCM数据格式
wave文件(*.wav)格式、PCM数据格式1. 音频简介经常见到这样的描述: 44100HZ 16bit stereo 或者22050HZ 8bit mono 等等.44100HZ 16bit stereo: 每秒钟有44100 次采样, 采样数据用16 位(2字节)记录, 双声道(立体声);22050HZ 8bit mono: 每秒钟有22050 次采样, 采样数据用8 位(1字节)记录, 单声道;当然也可以有16bit 的单声道或8bit 的立体声, 等等。
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。
采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位(左声道)和低八位(右声道)分别代表两个声道。
人对频率的识别范围是20HZ - 20000HZ, 如果每秒钟能对声音做20000 个采样, 回放时就足可以满足人耳的需求. 所以22050 的采样频率是常用的, 44100已是CD音质, 超过48000的采样对人耳已经没有意义。
这和电影的每秒24 帧图片的道理差不多。
每个采样数据记录的是振幅, 采样精度取决于储存空间的大小:1 字节(也就是8bit) 只能记录256 个数, 也就是只能将振幅划分成256 个等级;2 字节(也就是16bit) 可以细到65536 个数, 这已是CD 标准了;4 字节(也就是32bit) 能把振幅细分到4294967296 个等级, 实在是没必要了.如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍.这样我们就可以根据一个wav 文件的大小、采样频率和采样大小估算出一个wav 文件的播放长度。
譬如"Windows XP 启动.wav" 的文件长度是424,644 字节, 它是"22050HZ / 16bit / 立体声" 格式(这可以从其"属性->摘要" 里看到),那么它的每秒的传输速率(位速, 也叫比特率、取样率)是22050*16*2 = 705600(bit/s), 换算成字节单位就是705600/8 = 88200(字节/秒),播放时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。
常见的声音文件格式
常见的声音文件格式声音文件格式是用来储存、传输和播放声音的一种文件格式。
目前常见的声音文件格式有MP3、WAV、AIFF、FLAC和OGG等。
首先,MP3是一种广泛应用于音频压缩的文件格式。
它通过压缩音频数据来减小文件大小,但保持高质量的音频声音。
MP3文件格式使音频文件易于传输和共享,适合在各种设备上播放,如电脑、手机、MP3播放器等。
MP3文件格式广泛应用于音乐、广播、电影和其他多媒体领域。
它被广大用户所熟知和喜爱。
其次,WAV是一种无损的声音文件格式。
它以原始音频数据的形式储存声音,无任何压缩。
这样的文件格式可以保持音频的原始质量,并提供高保真的声音效果。
WAV文件格式在音频制作和编辑领域被广泛使用,如音乐制作、录音棚、电影制作等。
尽管WAV文件相对较大,但它提供了最高质量的声音。
除了WAV,AIFF也是一种无损声音文件格式。
它由苹果公司开发,并在Macintosh系统中被广泛使用。
AIFF文件格式具有与WAV相似的特点,支持无损音频数据的存储和传输,以及高质量的声音效果。
AIFF文件格式常用于音乐制作、音频编辑和传输,具有广泛的应用和兼容性。
另外,FLAC是一种开源无损的音频压缩格式。
与MP3不同,FLAC通过压缩音频数据来减小文件大小,但保持无损质量的音频声音。
FLAC文件格式可以实现较高的压缩比,使音频文件更容易存储和传输。
它被广泛用于音乐爱好者和音频专业人士之间的音频交流和分享。
最后,OGG是一种自由而开放的多媒体容器格式,支持多种音频和视频编码。
在音频方面,OGG文件格式通常使用Vorbis编码进行音频压缩。
它提供了相对较高的音频质量和较小的文件大小。
OGG文件格式适用于音乐、游戏、动画等领域,提供了多种解决方案和自定义选项。
总结起来,常见的声音文件格式包括MP3、WAV、AIFF、FLAC和OGG。
它们在音频压缩、无损音频、高保真声音和多媒体容器方面都有各自的特点和应用。
了解这些常见的声音文件格式对于使用、存储和传输声音文件都有指导意义,能够更好地满足不同需求和需求。
WAV文件格式分析与应用
14H
2
int
1(WAVE_FORMAT_PCM); 格式类别,1 表示为
PCM 形式的声音数据
16H
2
int
2; 通道数,单声道为 1,双声道为 2
18H
2
int
44100; 采样频率(每秒样本数)
1CH
4
long int 0x10B10000; 每秒数据量;其值为通道数×每秒数据
位数×每样本的数据位数/8。播放软件利用此值可以
采样一
采样二
……
低字节
高字节
低字节
高字节
……
16 位双声道:
采样一
……
左声道
右声道
……
低字节
高字节
低字节
高字节
……
图四、WAVE 文件数据采样格式
WAV 文件格式实例分析: 0123456789ABCDEF
00000000H 52 49 46 46 0A 06 01 00 57 41 56 45 66 6D 74 20 00000010H 12 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 00000020H 04 00 10 00 64 61 74 61 E6 05 01 00 00 00 00 00
RIFF/LIST 标志符
数据 1 大小
数据 1
格式/列表类型 数据
图二、RIFF/LIST 块结构 只要依循此一结构的文件,我们均称之为 RIFF 档。此种结构提供了一种系统化的分类。
如果和 MS 一 DOS 文件系统作比较,"RIFF"chunk 就好比是一台硬盘的根目录,其格式辨别码
便是此硬盘的逻辑代码(C:或 D:),而"L1ST"chunk 即为其下的子目录,其他的 chunk 则为一 般的文件。至于在 RIFF 文件的处理方面,微软提供了相关的函数。视窗下的各种多媒体文件 格式就如同在磁盘机下规定仅能放怎样的目录,而在该目录下仅能放何种数据。
WAV文件的头信息
{
char cRiffFlag[4];
UIN32 nFileLen;
char cWaveFlag[4];
char cFmtFlag[4];
char cTransition[4];
UIN16 nFormatTag ;
UIN16 nChannels;
04H 4 long int 文件长度
08H 4 char "WAVE"#34;标志
10H 4 过渡字节(不定)
14H 2 int 格式类别(10H为PCM形式的声音数据)
16H 2 int 通道数,单声道为1,双声道为2
18H 2 int 采样率(每秒样本数),表示每个通道的播放速度, (Hz) sample frequency
UIN16 nSamplesPerSec;
UIN32 nAvgBytesperSec;
UIN16 nBlockAlign;
UIN16 nBitNumPerSample;
char cDataFlag[4];
UIN16 nAudioLength;
} WAVEFORMAT;
16位PCM int 32767 -32767
///////////////////////////////////////////////////////////////////////下面是常用来表示的数据结构
unsigned short tag; /* MS PCM = 1 */
1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒样本数×每样本的数据位数(bit)/8。播放软件利用此值可以估计缓冲区的大小。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
wav格式
采样频率
AvgBytesPerSec 4 Bytes
BlockAlign
2 Bytes
BitsPerSample 2 Bytes
每秒所需字节数
数据块对齐单位(每个采样需要的字节 数)
每个采样需要的 bit 数
WAVE_FORMAT
2 Bytes 附加信息(可选,通过 Size 来判断有无)
图 3 Format Chunk 以'fmt '作为标示。一般情况下 Size 为 16,此时最后附加信息没有;如果为 18,则最后 多了 2 个字节的附加信息。主要由一些软件制成的 wav 格式中含有该 2 个字节的附加信息。
//Read RIFF_HEADER fread(&riff_header, sizeof(struct RIFF_HEADER), 1, wav_in);
if(memcmp(riff_header.szRiffID, "RIFF", 4) != 0 || memcmp(riff_header.szRiffFormat, "WAVE", 4) != 0 )
Fact Chunk
名称
所占字节数
具体内容
4 Bytes
‘fact’
Size
4 Bytes
数值为 4
data
4 Bytes
‘WAVE’
图 4 Fact Chunk Fact Chunk 是可选字段,一般当 wav 文件由某些软件转化而成,则包含该 Chunk。
Data Chunk
名称 ID Size data
2、具体介绍 RIFF WAVE Chunk
名称
所占字节数
具体内容
wav文件格式详解
WAV (Waveform audio format )是微软与IBM 公司所开发的一种声音编码格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows 平台的音频信息资源,被Windows 平台及其应用程序所广泛支持,也是其音乐发烧友中常用的指定规格之一。
由于此音频格式未经过压缩,所以在音质方面不会出现失真的情况,但档案的体积因而在众多音频格式中较为大。
该格式支持多种音频数字,取样频率和声道,标准格式化的WAV 文件和CD 格式一样,也是44.1K 的取样频率,16位量化数字,因此在声音文件质量和CD 相差无几! WAV 打开工具是WINDOWS 的媒体播放器。
每个WAVE 文件的头四个字节便是“RIFF”。
WAVE 文件由文件头和数据体两大部分组成。
其中文件头又分为RIFF /WAV 文件标识段和声音数据格式说明段两部分。
WAVE 文件各部分内容及格式见下表。
文件头声音数据块偏移地址 字节数 类型 内容24H~27H 4 字符 数据标志符(data ) 28H~2BH 4 长整型 采样数据总数 2CH......采样数据示例下图是用UltraEdit 打开的wav 文件的部分截图偏移地址 字节数 类型 内容00H~03H 4 字符 资源交换文件标志(RIFF ) 04H~07H 4 长整数 从下个地址开始到文件尾的总字节数 08H~0BH 4 字符 WAV 文件标志(WAVE ) 0CH~0FH 4 字符 波形格式标志(FMT )10H~13H 4 整数 过滤字节(一般为00000010H )14H~15H 2 整数 格式种类(值为1时,表示数据为线性PCM 编码)16H~17H 2 整数 通道数,单声道为1,双声音为2 18H~1BH 4 长整数 采样频率1CH~1FH 4 长整数 波形数据传输速率(每秒平均字节数) 20H~21H 2 整数 数据的调整数(按字节计算) 22H~23H2整数样本数据位数此段W A V文件是使用window自带的录音机软件完成,生成的16进制文件内容,采用用的是小段存放格式(高地址存储高位,低地址存储低位)按字节存储(8bit)补充头文件样例说明:(1)“52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个WAVE 文件头。
WAV文件格式说明
1. 音频简介经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道;当然也可以有 16bit 的单声道或 8bit 的立体声, 等等。
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。
采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位(左声道)和低八位(右声道)分别代表两个声道。
人对频率的识别范围是 20HZ - 20000HZ, 如果每秒钟能对声音做 20000 个采样, 回放时就足可以满足人耳的需求. 所以 22050 的采样频率是常用的, 44100已是CD音质, 超过48000的采样对人耳已经没有意义。
这和电影的每秒 24 帧图片的道理差不多。
每个采样数据记录的是振幅, 采样精度取决于储存空间的大小:1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了.如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍.这样我们就可以根据一个 wav 文件的大小、采样频率和采样大小估算出一个wav 文件的播放长度。
譬如 "Windows XP 启动.wav" 的文件长度是 424,644 字节, 它是"22050HZ / 16bit / 立体声" 格式(这可以从其 "属性->摘要" 里看到),那么它的每秒的传输速率(位速, 也叫比特率、取样率)是 22050*16*2 = 705600(bit/s), 换算成字节单位就是 705600/8 = 88200(字节/秒), 播放时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。
wav文件文件头格式
一、WAVE文件格式剖析WA VE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文ResourceInterchangeFileFormat的缩写,每个W A VE文件的头四个字节便是“RIFF”。
WA VE文件由文件头和数据体两大部分组成。
其中文件头又分为RIFF/WAV 文件标识段和声音数据格式说明段两部分。
W A VE文件各部分内容及格式见附表。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。
采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WA VE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。
W A VE文件是由样本组织而成的。
在单声道W A VE文件中,声道0代表左声道,声道1代表右声道。
在多声道W A VE文件中,样本是交替出现的。
WA VE文件格式说明表偏移地址字节数数据类型内容文件头00H4char"RIFF"标志04H4longint文件长度08H4char"WA VE"标志0CH4char"fmt"标志10H4过渡字节(不定)14H2int格式类别(10H为PCM形式的声音数据)16H2int通道数,单声道为1,双声道为218H2int采样率(每秒样本数),表示每个通道的播放速度,1CH4longint波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。
播放软件利用此值可以估计缓冲区的大小。
20H2int数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。
WAV(PCM)文件格式分析
18H 2 int 采样率(每秒样本数),表示每个通道的播放速度,
1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每 样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
样本大小 数据格式 最大值 最小值
8位PCM unsigned int 225 0
16位PCM int 32767 -32767�
0CH 4 char "fmt"标志
10H 4 过渡字节(不定)
14H 2 int 格式类别(10H为PCM形式的声音数据)
W AVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。
WAVE文件格式说明表
偏移地址 字节数 数据类型 内 容
8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右)
16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节
16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节
WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
WAV文件格式说明
1. 音频简介经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声);22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道;当然也可以有 16bit 的单声道或 8bit 的立体声, 等等。
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。
采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位(左声道)和低八位(右声道)分别代表两个声道。
人对频率的识别范围是 20HZ - 20000HZ, 如果每秒钟能对声音做 20000 个采样, 回放时就足可以满足人耳的需求. 所以 22050 的采样频率是常用的, 44100已是CD音质, 超过48000的采样对人耳已经没有意义。
这和电影的每秒 24 帧图片的道理差不多。
每个采样数据记录的是振幅, 采样精度取决于储存空间的大小:1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了.如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍.这样我们就可以根据一个 wav 文件的大小、采样频率和采样大小估算出一个wav 文件的播放长度。
譬如 "Windows XP 启动.wav" 的文件长度是 424,644 字节, 它是"22050HZ / 16bit / 立体声" 格式(这可以从其 "属性->摘要" 里看到),那么它的每秒的传输速率(位速, 也叫比特率、取样率)是 22050*16*2 = 705600(bit/s), 换算成字节单位就是 705600/8 = 88200(字节/秒), 播放时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。
WAV格式解析
ID big-endian FOURCC 值为'R' 'I' 'F' 'F' Size little-endian data字段中数据的字节数Data big-endian包含其它的chunkID big-endian FOURCC 值为 'f' 'm' 't' ' 'Size little-endian数据字段包含数据的⼤⼩。
如⽆扩展块,则值为16;有扩展块,则值为 16 + 2字节扩展块长度 + 扩展块长度或者值为18(只有扩展块的长度为2字节,值为0)Data little-endianformat_tag2字节,表⽰⾳频数据的格式。
如值为1,表⽰使⽤PCM格式。
little-endianchannels2字节,声道数。
值为1则为单声道,为2则是双声道。
little-endiansamples_per_sec采样率,主要有22.05KHz,44.1kHz和48KHz。
little-endianbytes_per sec⾳频的码率,每秒播放的字节数。
samples_per_sec *channels * bits_per_sample / 8,可以估算出使⽤缓冲区的⼤⼩little-endianblock_align数据块对齐单位,⼀次采样的⼤⼩,值为声道数 * 量化位数 / 8,在播放时需要⼀次处理多个该值⼤⼩的字节数据。
WAV格式解析WAV为微软公司(Microsoft)开发的⼀种声⾳⽂件格式,它符合RIFF(Resource Interchange File Format)⽂件规范,⽤于保存Windows平台的⾳频信息资源,被Windows平台及其应⽤程序所⼴泛⽀持,该格式也⽀持MSADPCM,CCITT A LAW等多种压缩运算法,⽀持多种⾳频数字,取样频率和声道,标准格式化的WAV⽂件和CD格式⼀样,也是44.1K的取样频率,16位量化数字,因此在声⾳⽂件质量和CD相差⽆⼏。
WAV格式即WAV
WAV格式即WAV。
RIFF WAVE Chunk和Size所占用的字节数,即FileLen - 8 = Size。
然后是Type字段,为'WAVE',表图2| 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来判断有无)| |图3 Format Chunk以'fmt '作为标示。
一般情况下Size为16,此时最后附加信息没有;如果为18图3则最后多了2个字节的附加信息。
主要由一些软件制成的wav格式中含有该2个字节的附加信息。
结构定义如下: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' |结构定义如下:| 16bit量化|声道0 | 声道0 | 声道0 | 声道0 || | (低位字节)| (高位字节)| (低位字节)| (高位字节)|| | 取样1 || 双声道|| 16bit量化|声道0(左)| 声道0(左)| 声道1(右)| 声道1(右)| | | (低位字节)| (高位字节)| (低位字节)| (高位字节)图6 wav数据bit位置安排方式Data Chunk头结构定义如下:struct DATA_BLOCK{char szDataID[4]; // 'd','a','t','a'DWORD dwDataSize;};//wave文件头typedef struct WaveHeader{uint8 riff[4]; //资源交换文件标志uint32 size; //从下个地址开始到文件结尾的字节数uint8 wave_flag[4]; //wave文件标识uint8 fmt[4]; //波形格式标识uint32 fmt_len; //过滤字节(一般为00000010H)uint16 tag; //格式种类,值为1时,表示PCM线性编码uint16 channels; //通道数,单声道为1,双声道为2uint32 samp_freq; //采样频率uint32 byte_rate; //数据传输率(每秒字节=采样频率×每个样本字节数) uint16 block_align; //块对齐字节数= channles * bit_samp / 8uint16 bit_samp; //bits per sample (又称量化位数)} wave_header_t;typedef struct WaveStruct{FILE *fp; //file pointerwave_header_t header; //headeruint8 data_flag[4]; //数据标识符uint32 length; //采样数据总数uint32 *pData; //data} wave_t;wave_t wave;1. [代码][C/C++]代码001 #include "stdlib.h"002 #include "stdio.h"003004 int main()005 {006 int i; //用作循环计数007 unsigned char ch[100]; //用来存储wav文件的头信息008 FILE *fp;009010 fp=fopen("1.wav","rb");//为读,打开一个wav文件011012 if((fp=fopen("1.wav","rb"))==NULL) //若打开文件失败,退出013 {014 printf("can't open this file\n"); 015 exit(0);016 }017018 /**********输出wav文件的所有信息**********/019 printf("该wav文件的所有信息:");020 for(i=0;i<58;i++)021 {022 ch[i]=fgetc(fp); //每次读取一个字符,存在数组ch中023 if(i%16==0) //每行输出16个字符对应的十六进制数024 printf("\n");025 if(ch[i]<16) //对小于16的数,在前面加0,使其用8bit显示出来026 printf("0%x ",ch[i]); 027 else028 printf("%x ",ch[i]);029 }030031 /*********RIFF WAVE Chunk的输出*********/ 032 printf("\n\nRIFF WAVE Chunk信息:"); 033 //输出RIFF标志034 printf("\nRIFF标志:");035 for(i=0;i<4;i++)036 {037 printf("%x ",ch[i]); 038 }039040 //输出size大小041 printf("\nsize:ox");042 for(i=7;i>=4;i--) //低字节表示数值低位,高字节表示数值高位043 {044 if(ch[i]<16)045 printf("0%x",ch[i]); 046 else047 printf("%x",ch[i]);048 }049050 //输出WAVE标志051 printf("\nWAVE标志:");052 for(i=8;i<12;i++)053 {054 if(ch[i]<16)055 printf("0%x ",ch[i]); 056 else057 printf("%x ",ch[i]);058 }059060 /*******Format Chunk的输出*******/061 printf("\n\nFormat Chunk信息:");062 //输出fmt 标志063 printf("\nfmt 标志:");064 for(i=12;i<16;i++)065 {066 if(ch[i]<16)067 printf("0%x ",ch[i]); 068 else069 printf("%x ",ch[i]);070 }071072 //输出size段073 printf("\nsize:ox");074 for(i=19;i>15;i--)075 {076 if(ch[i]<16)077 printf("0%x",ch[i]);078 else079 printf("%x",ch[i]);080 }081082 //输出编码方式083 printf("\n编码方式:ox");084 for(i=21;i>19;i--)085 {086 if(ch[i]<16)087 printf("0%x",ch[i]);088 else089 printf("%x",ch[i]);090 }091092 //输出声道数目093 printf("\n声道数目:ox");094 for(i=23;i>21;i--)095 {096 if(ch[i]<16)097 printf("0%x",ch[i]);098 else099 printf("%x",ch[i]);100 }101102 if(ch[i+1]==1) //1表示单声道,2表示双声道103 printf(" 单声道");104 else105 printf(" 双声道");106107 //输出采样频率108 printf("\n采样频率:ox");109 for(i=27;i>23;i--)110 {111 if(ch[i]<16)112 printf("0%x",ch[i]); 113 else114 printf("%x",ch[i]);115 }116117 //输出每秒所需字节数118 printf("\n每秒所需字节数:ox");119 for(i=31;i>27;i--)120 {121 if(ch[i]<16)122 printf("0%x",ch[i]); 123 else124 printf("%x",ch[i]);125 }126127 //输出数据块对齐单位128 printf("\n数据块对齐单位:ox");129 for(i=33;i>31;i--)130 {131 if(ch[i]<16)132 printf("0%x",ch[i]); 133 else134 printf("%x",ch[i]);135 }136137 //输出每个采样所需bit数138 printf("\n每个采样所需bit数:ox"); 139 for(i=35;i>33;i--)140 {141 if(ch[i]<16)142 printf("0%x",ch[i]);144 printf("%x",ch[i]); 145 }146147 //输出附加信息148 if(ch[16]==18) //若Format Chunk的size大小为18,则该模块的最后两个字节为附加信息149 { //若为16,则无附加信息150 printf("\n附加信息:ox");151 for(i=37;i>35;i--)152 {153 if(ch[i]<16)154 printf("0%x",ch[i]);155 else156 printf("%x",ch[i]);157 }158 }159160 /*******Fact Chunk的输出*******/161 printf("\n\nFact Chunk信息:");162 //输出fact标志163 printf("\nfact标志:");164 for(i=38;i<42;i++)165 {166 if(ch[i]<16)167 printf("0%x ",ch[i]);168 else169 printf("%x ",ch[i]);170 }171172 //输出size173 printf("\nsize:ox");174 for(i=45;i>41;i--)175 {176 if(ch[i]<16)177 printf("0%x",ch[i]);179 printf("%x",ch[i]);180 }181182 //输出data段数据183 printf("\ndata段数据:");184 for(i=46;i<50;i++)185 {186 if(ch[i]<16)187 printf("0%x ",ch[i]); 188 else189 printf("%x ",ch[i]);190 }191192 /*******Data Chunk的输出*******/193 printf("\n\nData Chunk信息:");194 //输出data标志195 printf("\ndata标志:");196 for(i=50;i<54;i++)197 {198 if(ch[i]<16)199 printf("0%x ",ch[i]); 200 else201 printf("%x ",ch[i]);202 }203204 //输出数据大小205 printf("\n数据大小:ox");206 for(i=57;i>53;i--)207 {208 if(ch[i]<16)209 printf("0%x",ch[i]); 210 else211 printf("%x",ch[i]);212 }213214 printf("\n"); 215216 fclose(fp); 217 }。
WAV文件的结构剖析
WAV 文件的结构剖析王 颀 赵世刚 张春寿 计算机多媒体技术的发展使视听处理技术产生了巨大进步。
用计算机“剪”、“拼”、“接”的视频、音频节目比比皆是。
这些视、音频文件在计算机内的存储结构和组织结构对使用者是透明的,这给技术人员带来困惑和诸多不便(例如:受病毒攻击或误操作需恢复文件时)。
如果掌握了这类文件结构,就可用一些简单的维护软件,以“特征字符”为引导,将各簇挂接,恢复文件。
下面以非压缩的基本WAV 文件(扩展名为wav )为例,介绍音频文件的储存与组织结构,以期达到抛砖引玉的目的。
WAV 音频文件是存储数字音频(波形)数据的文件。
它支持多种分辨采样频率和多声道音频,在IBM 平台上非常流行。
广泛应用在专业数字音频波形节目制作上,这种格式采用微软电子技术交换文件介绍的方式以块存储数据。
11数据的组织所有数据以字节(8位二进制)方式存储,多字节数据值按低位优先顺序存储,如图1所示。
21文件结构WAV 文件是不同类型块的集合。
其中,所必需的格式块内含描述波形的重要参数(诸如采样频率等);数据块内含音频波形数据,两者关系见图2。
31样本点和样本帧样本点是某时间点上所采到的一个语音样本幅值(简称采样值)。
单字节采样值以无符号数0—255表示;采样值超过8位二进制值92 济南教育学院学报2000年第3期 时,则以2的补码形式表示。
例如:16位二进制数(0111111111111111)B十六进制的(7FFF )H 表示(32767)D (最大值),(8000)H 表示(32768)D (最小值)。
采样值在9—16位时用二字节描述;采样值在17—24位时用三字节描述;采样值在25—32位时用四字节描述。
采样值的数据位应遵循左对齐及余位补“O ”规则。
例如,采样值为12位,用4—15位存储该值,0—3位填“0”。
具体讲,采样值为二进制101000010111,数据描述如图3所示。
需要特别指出的是:机内存储要求低字节优先,波形数据要求最高位优先。
wav文件的文件头信息详解
wav⽂件的⽂件头信息详解wav⽂件的⽂件头wave⽂件的格式:00H 4 char "RIFF"标志 04H 4 long int ⽂件长度 08H 4 char "WAVE"标志 0CH 4 char "fmt"标志 10H 4 过渡字节(不定) 14H 2 int 格式类别(10H为PCM形式的声⾳数据) 16H 2 int 通道数,单声道为1,双声道为2 18H 2 int 采样率(每秒样本数),表⽰每个通道的播放速度, 1CH 4 long int 波形⾳频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。
播放软件利⽤此值可以估计缓冲区的⼤⼩。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。
播放软件需要⼀次处理多个该值⼤⼩的字节数据,以便将其值⽤于缓冲区的调整。
22H 2 每样本的数据位数,表⽰每个声道中各个样本的数据位数。
如果有多个声道,对每个声道⽽⾔,样本⼤⼩都⼀样。
24H 4 char 数据标记符"data" 28H 4 long int 语⾳数据的长度楼主的帖⼦,⽂件头长度加起来是42字节,但是实际长度是44个字节(⽤UltraEdit打开⼀个WAVE⽂件,数⼀下就知道了)。
如果⽤以个结构体来定义WAVE⽂件头应该为: struct WAVEFILEHEADER { char chRIFF[4]; DWORD dwRIFFLen; char chWAVE[4]; char chFMT[4]; DWORD dwFMTLen; PCMWAVEFORMAT pwf; char chDATA[4]; DWORD dwDATALen; };但是实际测试,并不是所有的wave⽂件头都⼀样。
⽐较⿇烦的就是windows下⾃带的那个录⾳机录下的wav,⽂件头有58个Byte。
wav音频格式
多媒体技术近年来发展很快,较好品质的声卡可以提供16位的立体声及44KHZ的播放录制能力,它不仅可以提供原音逼真的取样,其合成的音质也十分理想,有的声卡还加入了数字信号处理器,可编程控制的DSP具有强大的运算能力,它可以用来作声音信息的压缩和一些特殊效果的处理。
具有此功能的声卡提供的WAV文件提供的语音信息可以满足语音特征识别的要求。
RIFF概念在Windows环境下,大部分的多媒体文件都依循着一种结构来存放信息,这种结构称为"资源互换文件格式"(Resources lnterchange File Format),简称RIFF。
例如声音的WAV文件、视频的AV1文件等等均是由此结构衍生出来的。
RIFF可以看做是一种树状结构,其基本构成单位为chunk,犹如树状结构中的节点,每个chunk由"辨别码"、"数据大小"及"数据"所组成。
图一、块的结构示意图辨别码由4个ASCII码所构成,数据大小则标示出紧跟其后数据的长度(单位为Byte),而数据大小本身也用掉4个Byte,所以事实上一个chunk的长度为数据大小加8。
一般而言,chunk本身并不允许内部再包含chunk,但有两种例外,分别为以"RIFF"及"L1ST"为辨别码的chunk。
而针对此两种chunk,RIFF又从原先的"数据"中切出4个Byte。
此4个Byte 称为"格式辨别码",然而RIFF又规定文件中仅能有一个以"RIFF"为辨别码的chunk。
图二、RIFF/LIST块结构只要依循此一结构的文件,我们均称之为RIFF档。
此种结构提供了一种系统化的分类。
如果和MS一DOS文件系统作比较,"RIFF"chunk就好比是一台硬盘的根目录,其格式辨别码便是此硬盘的逻辑代码(C:或D:),而"L1ST"chunk即为其下的子目录,其他的chunk则为一般的文件。