【数据压缩】第三次作业——WAV文件分析

WAV文件分析

问题回答

AVI文件格式

在这里插入图片描述

avi的二进制文件是按小端原则存放的,即数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

打开一个avi文件:

在这里插入图片描述

音频和视频的数据是如何放置的?交织放置 or 连续放置?

观察所选avi文件

在第00002700行有文件中第一个“01wb”,代表一个wave块即音频数据
在这里插入图片描述

第0000df80行有第二个“01wb”,代表一个wave块即音频数据

在这里插入图片描述

在第000028b0行有文件中第一个“00dc”,代表压缩后的DIBs视频数据
在这里插入图片描述

在第0000e2d0行和第0000e2e0行有第二个和第三个“00dc”,代表压缩后的视频数据
在这里插入图片描述

00002700 < 000028b0 < 0000df80 < 0000e2d0 < 0000e2e0,因此可以知道在avi文件中音频和视频数据是交织放置

一个视频帧大约占据多少字节?一个音频数据块大约占用多少字节?

视频

第一个视频数据块

在这里插入图片描述

大小为00 00 B6 C8,即46792个字节

第二个视频数据块
在这里插入图片描述

大小为0

第三个视频数据块

在这里插入图片描述

大小为00 00 05 4E,即1358个字节

第四个视频数据块

在这里插入图片描述

大小为00 00 07 30,即1840个字节

第五个视频数据块

在这里插入图片描述

大小为00 00 15 DD,即5597个字节

继续搜索发现视频数据块的大小各不相同

音频

第一个音频数据块

在这里插入图片描述

第二个音频数据块

在这里插入图片描述

第三个音频数据块

在这里插入图片描述

第四个音频数据块
在这里插入图片描述

图中绿色框中的数据是音频数据块的大小,通过查找发现大多数音频数据块的大小都是00 00 01 A2,即418个字节

wav文件分析

概述

Waveform Audio File FormatWAVE,又或者是因为扩展名而被大众所知的WAV),是微软与IBM公司所开发在个人电脑存储音频流的编码格式, 此格式属于资源交换文件格式(RIFF)的应用之一,通常会将采用脉冲编码调制的音频资源存储在区块中。

此视频格式不对原有文件进行压缩,所以在音质方面无失真情况,但是文件的体积较大。

一定注意,“未经压缩”和“无损”是两个不同的概念,如果源文件是有损压缩的文件如mp3格式,将其转换成wav格式后也只是未经压缩的有损文件而已。

文件格式

想要了解WAV文件格式,需要首先对RIFF文件格式有一个初步的认识。RIFF文件的基本组成单元是文件块(chunk),每个文件块都由4个字节的标识码、4个字节的块数据大小(除去标识码和自身)以及数据。 RIFF格式规定,只有 RIFF及LIST块可以含有子块,其它的块不允许包含子块。由于RIFF格式文档本身就是一个数据块,因此对于RIFF块来说,其数据部分的前4个字节是文件格式类型标识(如WAVE、AVI等等),后面部分就是RIFF的子块。

WAV文件是属于RIFF结构形式的文件,WAV文件一般由3个区块组成,分别是RIFF数据块、描述文件信息的fmt子块以及表示真正音频数据的data数据块。 文件中还可能包含一些可选的区块,如:Fact chunk,在下图所示的标准WAV文件中就没有该子块,只有通过某些软件进行转化的过程中可能会加入该子块,其主要存储一些关于该文件的重要信息(如压缩编码信息等)。

在这里插入图片描述

所选音频文件

在这里插入图片描述

观察上述所选音频文件,可以知道该音频文件大小为3810950字节

在这里插入图片描述

该文件的播放时间为22秒

存储格式

WAV文件以小端形式来进行数据存储,即数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

需要注意的是,数据块中的“标识符”部分仍以大端形式存储

RIFF Chunk

RIFF Chunk的具体结构如下:

名称字节数说明
标识符(RIFF)4字节52 49 46 46
数据大小4字节表示整个wav文件的数据大小
格式辨别码(“WAVE”)4字节

用vs2019观察所选文件:

在这里插入图片描述

  • 红色的框表示标识符RIFF,其52 49 46 46对应RIFF的ASCII码

  • 绿色的框表示wav文件的数据大小,需要注意的是,这里读取的方式应是低位在前高位在后,也就是该文件大小的十六进制表示应该是00 3A 26 7E,转换成十进制为3810942个字节,与“属性”显示的文件大小差8个字节,也就是此文件中的标识符和格式辨别码的8个字节

  • 橙色的框表示格式辨别码,57 41 56 45对应WAVE的ASCII码

  • 其结构体表示为:

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

文件信息块fmt

该部分的具体内容如下:

名称字节数说明
格式块标识4字节小写字符串“fmt ”
格式块长度4字节格式块长度取决于编码形式(参见编码形式表
编码格式代码2字节常见的 WAV 文件使用 PCM 脉冲编码调制格式,该数值通常为 1。(参见编码形式表
声道个数2字节单声道为 1,立体声或双声道为 2
采样频率4字节每个声道单位时间采样次数。常用的采样频率有 11025, 22050 和 44100 Hz。
数据传输速率4字节声道数×采样频率×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
数据块对其单位2字节采样帧大小。该数值为:声道数×位数/8。播放软件需要一次处理多个该值大小的字节数据,用该数值调整缓冲区。
采样位数2字节存储每个采样值所用的二进制数位数。常见的位数有 4、8、12、16、24、32

其中,格式块长度和格式块代码与下面展示的编码形式表有关:

格式代码格式名称fmt 块长度fact 块
1(0x0001)PCM/非压缩格式16
2(0x0002)Microsoft ADPCM18
3(0x0003)IEEE float18
6(0x0006)ITU G.711 a-law18
7(0x0007)ITU G.711 μ-law18
49(0x0031)GSM 6.1020
64(0x0040)ITU G.721 ADPCM
65,534(0xFFFE)40

观察所选文件:

在这里插入图片描述

  • 红色的框表示标识符“fmt ”,66 6D 74 20分别是fmt和空格所对应的ASCII码

  • 绿色的框表示这一子块数据长度,十六进制表示,00 00 00 12,也就是共有18个字节

  • 橙色部分表示数据

    • 00 01表示该数据以PCM方式进行编码
    • 00 02表示该文件是双声道文件
    • 00 00 AC 44表示采样频率为44100Hz
    • 00 02 B1 10表示数据传输速率176400
    • 00 04表示块对其单位,说明该播放软件一次需要处理多个4字节大小的数据
    • 00 10表示每个采样值用16位进行表示,若有多个声道,则每个声道样本大小都一样, 高八位表示左声道,低八位表示右声道。
    • 00 00表示附加信息
  • 其结构体表示为:

    struct WAVE_FORMAT
    {
    	 WORD wFormatTag;
    	 WORD wChannels;
    	 DWORD dwSamplesPerSec;
    	 DWORD dwAvgBytesPerSec;
    	 WORD wBlockAlign;
    	 WORD wBitsPerSample;
    };
    struct FMT_BLOCK
    {
    	 TCHAR szFmtID[4];  //'f','m','t',' ' please note the
    	                     // space character at the fourth location.
         DWORD dwFmtSize;
         WAVE_FORMAT wavFormat;
    };
    

数据块Data

数据块中包含实际音频数据,其具体格式如下:

名称字节数说明
格式块标识4字节表示这是一个data块
格式块长度4字节表明数据块的长度
数据N字节表示音频数据

对于多声道文件,样本在数据中是交替出现的,如双声道8bit量化,则每个样本的高4位表示一个声道,低4位表示另一个声道

观察文件:

在这里插入图片描述

  • 红色的框表示data标识符,64 61 71 61表示data的ASCII码

  • 绿色的框表示音频数据的长度,00 3A 26 00表示数据长度为3810816个字节

  • 橙色部分的内容就是音频数据了,这段音频是双声道16bit量化,高八位表示左声道,低八位表示右声道。

  • 文件播放时间为音频数据字节数/数据传输速率=3810816/176400=21.6s≈22s

  • 结构体表示为:

    struct DATA_BLOCK
     {
      char szDataID[4]; // 'd','a','t','a'
      DWORD dwDataSize;
     };
    

LIST数据块

该文件在fmt数据块和data数据块之间还有80个字节的LIST数据块,如图
在这里插入图片描述

因此该文件可能是由其他格式转换成的wav文件,该部分数据的具体内容没有找到相应的资料,可能后续会进行补充

参考文献

结构体的c语言表示是在查找资料的时候找到的,觉得对理解文件的格式有帮助,因此也做了记录

  1. 维基百科 https://zh.wikipedia.org/wiki/WAV
  2. wav文件分析 https://zhuanlan.zhihu.com/p/45518641
  3. wav文件格式分析 https://codeantenna.com/a/3Mdc0fRshG
  4. WAVE PCM soundfile format http://soundfile.sapp.org/doc/WaveFormat/
  5. wav文件格式分析 https://www.cnblogs.com/ranson7zop/p/7657874.html
  6. wav格式详解 https://www.jianshu.com/p/947528f3dff8
  7. avi文件详解 https://blog.csdn.net/intel1985/article/details/114284756
  8. avi格式解析 https://zhuanlan.zhihu.com/p/162679898
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值