数据压缩——WAV文件格式分析

本文详细介绍了WAV文件的结构和格式,包括RIFF头、WAVE标识、fmt和data chunk等关键部分,并通过代码展示了如何读取WAV文件的数据段长度、通道数、采样频率等信息。此外,还提供了结构体定义和文件读取操作的示例,帮助理解WAV文件的解析过程。
摘要由CSDN通过智能技术生成


WAV文件概述

WAV文件是在PC机上常见且最经典的多媒体音频文件,文件扩展名为WAV,是WAVEFOM的简写,也称为波形文件,可以直接存储声音波形。
它符合RIFF文件规范,且每个WAVE文件的头四个字节便是“RIFF”。

WAV文件格式

在这里插入图片描述每个Chunk有各自的ID,位于Chunk最开始位置,以该数据块ID的ASCII表示,均为4个字节。在ID后面的是该Chunk大小:去除ID和Size所占的字节数后剩下的其他字节数目。

数据块ID数据块大小

一、案例分析

在这里插入图片描述打开一个WAV文件:

读取分析内容可知其数据长度为4022444字节,其中WAV的数据信息占4022272字节。

在这里插入图片描述

WAV属性中显示WAV文件大小一共是4022456字节,是将“ RIFF,数据大小字段,WAVE ”这几个字符所占的12字节算入。

偏移地址数值含义
00H52 49 46 46表示“RIFF”标识,是RIFF的ASCII码
04HB0 60 3D 00表示除去RIFF标识和自身4个字节后面部分的长度;其后四位为高位,前四位为低位,因此数据段长度应为:00 3D 60 B0=4022448,加上前8个字节为4022456。
08H57 41 56 45是WAVE的ASCII码
0CH66 6D 74 20是fmt的ASCII码,下面是fmt数据块的信息
10H10 00 00 00后四位为高位,应看作00 00 00 10,表示是16PCM,16bit数据表示一个量化结果
14H01 00后两位是高位,应看作00 01,为1时表示线性PCM编码,大于1时表示有压缩的编码,这里是PCM编码。
16H02 00应看作00 02,1为单声道,2为双声道,这里是双声道
18H44 AC 00 0000 00 AC 44=44100表示采样频率是44100HZ
1CH10 B1 02 00Byte率=采样频率音频通道数每次采样得到的样本位数/8,00 02 B1 10=176400,采样频率为44100HZ,是双声道,样本位数为16,则176400是44100216/8的结果。
20H04 00块对齐=通道数每次采样得到的样本位数/8,0004H,也就是4=216/8。
22H10 00样本数据位数,00 10=16,一个量化样本占2字节。
24H4C 49 53 54是LIST的ASCII码值
28H84 00 00 00表示LIST数据块的长度为00 00 00 84=132字节
2CH49 4E 46 4F为“INFO”的ASCII码值
30H在这里插入图片描述该数据块是IART数据块,49 41 52 54是“IART”的ASCII码,00 00 00 18=24字节是该数据块数据部分长度
50H在这里插入图片描述49 47 4E 52是IGNR数据块的ASCII码表示,00 00 00 06=6字节是该部分数据部分的长度
5EH在这里插入图片描述49 4E 41 4D为“INAM”的ASCII码值,00 00 00 0A=10字节为该数据块数据部分长度
70H在这里插入图片描述49 50 52 44为"IPRD"的ASCII码值,00 00 00 16=22字节是该部分数据字段长度
8EH在这里插入图片描述49 50 52 54是IPRT的ASCII码,00 00 00 03=3字节,该部分数据长3字节不足4字节用0补全
9AH在这里插入图片描述49 53 46 54是ISFT的ASCII码,00 00 00 0E=14字节表示该数据段的长度
B0H64 61 74 61表示data的ASCII码
B4H00 60 3D 00应看作00 3D 60 00=4022272是数据data数据段的大小

在这里插入图片描述

二、代码分析

1.建立结构体

代码如下:

struct WAV_struct
{
    unsigned long FILEsize;         //文件大小
    unsigned short Channel;        //通道数
    unsigned long FS;             //采样频率
    unsigned long BPS;           //Byte率
    unsigned short sample_bit;  //一个样本的位数
    unsigned long DATAsize;    //数据大小
    unsigned char* data;      //音频数据 

};

2.读取数据段长度

利用函数seekg(偏移地址);可以从文件数据中获取文件大小
seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。
对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:
iOS::beg:表示输入流的开始位置
ios::cur:表示输入流的当前位置
ios::end:表示输入流的结束位置
tellg()函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小。

代码如下:

fs.seekg(0, ios::end);        
    WAV.FILEsize = fs.tellg();

    fs.seekg(0x16);
    fs.read((char*)&WAV.Channel, sizeof(WAV.Channel));

    fs.seekg(0x18);
    fs.read((char*)&WAV.FS, sizeof(WAV.FS));

    fs.seekg(0x1c);
    fs.read((char*)&WAV.BPS, sizeof(WAV.BPS));

    fs.seekg(0x22);
    fs.read((char*)&WAV.sample_bit, sizeof(WAV.sample_bit));

    fs.seekg(0xB4);
    fs.read((char*)&WAV.DATAsize, sizeof(WAV.DATAsize));

    WAV.data = new unsigned char[WAV.DATAsize];

    fs.seekg(0xB8);
    fs.read((char*)WAV.data, sizeof(char) * WAV.DATAsize);

3.结果

在这里插入图片描述(最后一行为最末尾20个字符)

参考

https://blog.csdn.net/angeljing521/article/details/51701179
https://blog.csdn.net/u013521296/article/details/90598169
https://www.cnblogs.com/ranson7zop/p/7657874.html
https://zhuanlan.zhihu.com/p/45518641
http://blog.sina.com.cn/s/blog_6da4642d0100rw4g.html

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
软件名称:Monkey's Audio 软件版本:4.06 运行环境:WinALL 汉化类型:汉化安装版 软件性质:免费 官方主页:http://www.monkeysaudio.com ━━━━━━━━━━━━━━━ 软件简介 ━━━━━━━━━━━━━━━ Monkey's Audio(http://www.monkeysaudio.com)是一种无损压缩技术。他并不是由什么大公司发明的,完全是一个个人业余兴趣作品。为了使Monkey's Audio能有更好的发展,现在这个软件已经公开了源代码。   这种压缩格式的特点是无损压缩,也就是说对压缩数据进行还原之后得到的数据与原来的数据是完全相同的。该格式的特点尤其适合那些拥有一对“金耳朵”并且一直对mp3的音质耿耿于怀的音乐发烧友。后者有人会问,要无损压缩,我随便找个压缩软件比如WINRAR都可以达到不错的效果了,还要这种格式干嘛? 所以这里要澄清一个误解:使用普通的压缩软件进行压缩无疑是可以得到不错的压缩效果,有时候甚至更优于使用Monkey's Audio,但是压缩软件生成的压缩包必须要先解压还原之后才能播放里面的内容,而Monkey's Audio这种无损压缩编码得到的文件可以直接使用播放器(比如WinAMP)进行播放。Monkey's Audio的压缩效果大约在2:1左右,也就是说压缩结果是原来的二分之一大小。一张CD大约需要330MB左右的空间存放,相比之下还是比较占空间的。由于这个原因,所以对音质要求不是太高的人通常都选择VBR方式的mp3而不是选择它。   与Monkey's Audio类似的编码格式还包括WavPack、RKAU、Shorten等等。由于相对不是那么出名,又或者在某些方面不够Monkey's Audio做得好,因此获得的关注程度就逊色很多。   Monkey's Audio 软件在Monkey‘s Audio官方网站可以下载,专用于压缩wav文件为ape文件或解压ape文件为wav文件   Monkey's Audio 是一种快速且易于操作的数字音乐压缩方案,它所生成的 APE 无损压缩格式,压缩率接近50%,压缩后的品质跟原始声音的品质完全是一样的(据说有人将 Wav 文件生成 APE 格式后,再转换回 Wav 文件,结果对比两个Wav 文件的 MD5 值时,发现居然完全一样)!   APE 无损压缩音频格式已被绝大多数音频播放器如:Winamp、Media Jukebox以及越来越多的应用程序支持。Monkey's Audio 是 APE 的压缩、解压缩、转换操作的平台。   本汉化安装版包括了原版的一切组件,无需原版文件,另外,用于 Winamp的APE插件安装程序也替换为汉化版。 ━━━━━━━━━━━━━━━ 汉化历程 ━━━━━━━━━━━━━━━ 2006.01.11 发布 Monkey's Audio 4.01 b1 汉化版 2006.03.14 发布 Monkey's Audio 4.01 b2 汉化版 2009.02.02 发布 Monkey's Audio 4.03 汉化版 2009.02.03 发布 Monkey's Audio 4.04 汉化版 2009.02.05 发布 Monkey's Audio 4.05 汉化版 2009.03.19 发布 Monkey's Audio 4.06 汉化版
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值