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

WAV文件分析

文章目录

  • WAV文件分析
    • 问题回答
      • AVI文件格式
      • 音频和视频的数据是如何放置的?交织放置 or 连续放置?
      • 一个视频帧大约占据多少字节?一个音频数据块大约占用多少字节?
        • 视频
        • 音频
    • wav文件分析
      • 概述
      • 文件格式
      • 所选音频文件
      • 存储格式
      • RIFF Chunk
      • 文件信息块fmt
      • 数据块Data
      • LIST数据块
    • 参考文献

问题回答

AVI文件格式

【数据压缩】第三次作业——WAV文件分析_第1张图片

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

打开一个avi文件:

【数据压缩】第三次作业——WAV文件分析_第2张图片

音频和视频的数据是如何放置的?交织放置 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文件中就没有该子块,只有通过某些软件进行转化的过程中可能会加入该子块,其主要存储一些关于该文件的重要信息(如压缩编码信息等)。

【数据压缩】第三次作业——WAV文件分析_第3张图片

所选音频文件

【数据压缩】第三次作业——WAV文件分析_第4张图片

观察上述所选音频文件,可以知道该音频文件大小为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 ADPCM 18
3(0x0003) IEEE float 18
6(0x0006) ITU G.711 a-law 18
7(0x0007) ITU G.711 μ-law 18
49(0x0031) GSM 6.10 20
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位表示另一个声道

观察文件:

【数据压缩】第三次作业——WAV文件分析_第5张图片

  • 红色的框表示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文件分析_第6张图片

因此该文件可能是由其他格式转换成的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

你可能感兴趣的:(数据压缩,其他)