失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Linux音频驱动-WAV文件格式分析

Linux音频驱动-WAV文件格式分析

时间:2022-12-29 19:56:52

相关推荐

Linux音频驱动-WAV文件格式分析

概述

WAV文件格式是Microsoft的RIFF规范的一个子集,用于存储多媒体文件。WAV(RIFF)文件由若干个Chunk组成,分别为: RIFF WAVE Chunk,Format Chunk,Fact Chunk(可选),Data Chunk。具体格式如下:

RIFF Chunk

根据RIFF的格式,可以抽象出RIFF chunk的结构体:

struct RIFF_CHUNK{char ChunkID[4]; //'R','I','F','F'unsigned int ChunkSize;char Format[4]; //'W','A','V','E'};

其中ChunkSize代表的是整个wav_file的大小减去ChunkID和ChunkSize的大小,即wav_file_size=ChunkSize+8。

Format Chunk

Format chunk主要是描述音频数据的格式。根据Format chunk的格式,可以抽象出Format Chunk的数据结构:

struct FORMAT_CHUNK{char FmtID[4]; //'f','m','t'unsigned int FmtSize;unsigned short FmtTag;unsigned short FmtChannels;unsigned int SampleRate;unsigned int ByteRate;unsigned short BlockAilgn;unsigned short BitsPerSample;};

.FmtSize:通常取值为16或者18,16代表是该音频使用PCM编码方式。.FmtTag:如果上述取值为16,则此值通常为1,代表该音频的编码方式是PCM编码。.FmtChannels:声道数目,1代表单声道,2代表双声道,就是所谓的立体声。.SampleRate:采样频率。如果对此概念不是很了解,可以查看此文章:Linux音频驱动-声音采集过程

.ByteRate:每秒所需的字节数。等于SampleRate * NumChannels * BitsPerSample/8。.BlockAilgn:数据块对齐单位。等于NumChannels * BitsPerSample/8。.BitsPerSample:采样位数。

Data Chunk

Data Chunk主要是描述raw sound数据和大小,根据Data Chunk格式,抽象出Data Chunk的数据结构:

struct DATA_CHUNK{char DataID[4]; //'d','a','t','a'unsigned int DataSize;};

DataSize就是整个raw data的大小。

实例分析

1. 在网上下载wav的音频文件,使用mediainfo显示该音频文件的详细信息。

root@test:~$ mediainfo ~/Download/test.wav GeneralComplete name : /home/test/Download/test.wavFormat: WaveFile size : 44.2 MiBDuration : 4mn 22sOverall bit rate mode: ConstantOverall bit rate: 1 411 KbpsAudioID : 0Format: PCMFormat settings, Endianness : LittleCodec ID : 1Duration : 4mn 22sBit rate mode : ConstantBit rate : 1 411.2 KbpsChannel(s) : 2 channelsSampling rate : 44.1 KHzBit depth : 16 bitsStream size: 44.2 MiB (100%)

2. 使用vim使用十六进制打开该文件

1 0000000: 5249 4646 741d c302 5741 5645 666d 7420 RIFFt...WAVEfmt 2 0000010: 1000 0000 0100 0200 44ac 0000 10b1 0200 ........D.......3 0000020: 0400 1000 6461 7461 501d c302 0100 0000 ....dataP.......4 0000030: ffff 0000 0000 0000 0000 0100 0000 ffff ................5 0000040: 0000 0100 0000 ffff 0000 0000 ffff 0100 ................6 0000050: 0200 ffff fdff 0100 0300 ffff ffff 0200 ................7 0000060: 0000 feff 0100 0200 ffff feff 0100 0200 ................8 0000070: ffff ffff 0100 0000 ffff 0100 0000 ffff ................

3. 分析上述的数据 "52 49 46 46" 对应的Ascii码字符为"RIFF"。 "74 1d c3 02" 对应的就是ChunkSize,对应的十六进制是:0x2c31d74=46341492。那整个wav文件的大小就为: 46341492+8=46341500。将此值转化为MB位单位: 44.2MB,可以验证上述使用mediainfo的信息。 "57 41 56 45" 对应的Ascii码字符为"WAVE"。

"66 6d 74 20" 对应的Ascii码字符为"fmt"。 "10 00 00 00" 四字节对应的是该音频的编码方式,通常为16,代表PCM编码方式。也就是十六进制0x10。 "01 00" 对应为1,代表PCM编码方式。 "02 00" 通道个数,通道数为2,验证上述mediainfo的信息。 "44 ac 00 00" 采用频率,转化为十六进制为: 0xac44=44100=44.1KHz "10 b1 02 00" 每秒所需的字节数,转化为十六进制为: 0x2b110=176400。通过此值可以计算该音频的时长: 46341500/17600=4.37。0.37*60=22.2,则该音频的时长为4mn22s。 "04 00" 数据对齐单位。 "10 00" 采样位数,等于0x10=16。 "64 61 74 61" 对应的Ascill码字符为"data"。 "50 1d c3 02" 对应该音频的raw数据的大小,转化为十六进制为0x2c31d50=46341456,此值等于wav_size-44=46341500-44。

如果觉得《Linux音频驱动-WAV文件格式分析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。