【数据压缩】WAV文件分析
AVI文件格式
什么是AVI
AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式。AVI格式允许视频和音频交错在一起同步播放,支持256色和RLE压缩,但AVI文件并未限定压缩标准,因此,AVI文件格式只是作为控制界面上的标准,不具备兼容性,用不同压缩算法生成的AVI文件,必须使用相应的解压缩算法才能播放出来。
RIFF文件结构
AVI文件采用的是RIFF文件结构方式,所以我们先来看看RIFF文件结构。
“RIFF”表示字符串(4字节) | RIFF文件大小(4字节) | 文件类型(4字节) | RIFF数据 |
由上图可知(52 49 46 46)为“RIFF”,(E2 37 D1 01)表示文件大小,(41 56 49 20)表示文件类型为AVI文件。
整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列 的子块,其中有一种字块的ID为"LIST",称为LIST,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。
AVI文件结构
AVI文件是目前使用的最复杂的RIFF文件,它能同时存储同步表现的音频视频数据。AVI的RIFF块的形式类型是AVI,它包含3个子块,如下所述:
信息块 | 一个ID为“hdrl”的LIST块 | 定义AVI文件的数据格式 |
数据块 | 一个ID为“movi”的LIST块 | 包含AVI的音视频序列数据 |
索引块 | ID为“idxl”的子块 | 定义“movi”LIST块的索引数据,是可选块 |
问题1:AVI文件中的各子块都存储那些信息?数据流如何存储?
信息块:包含两个子块,即一个ID为avih的子块和一个ID为strl的LIST块。
1、“avih”子块包含内容:
typedef struct
{
DWORD dwMicroSecPerFrame ; //显示每桢所需的时间ns,定义avi的显示速率
DWORD dwMaxBytesPerSec; // 最大的数据传输率
DWORD dwPaddingGranularity; //记录块的长度需为此值的倍数,通常是2048
DWORD dwFlages; //AVI文件的特殊属性,如是否包含索引块,音视频数据是否交叉存储
DWORD dwTotalFrame; //文件中的总桢数
DWORD dwInitialFrames; //说明在开始播放前需要多少桢
DWORD dwStreams; //文件中包含的数据流种类
DWORD dwSuggestedBufferSize; //建议使用的缓冲区的大小,
//通常为存储一桢图像以及同步声音所需要的数据之和
DWORD dwWidth; //图像宽
DWORD dwHeight; //图像高
DWORD dwReserved[4]; //保留值
}MainAVIHeader;
2、"strl" LIST块用于记录AVI数据流,每一种数据流都在该LIST块中占有3个子块,他们的ID分别是"strh","strf", "strd";
①“strh”子块定义内容:
typedef struct
{
FOURCC fccType; //4字节,表示数据流的种类 vids 表示视频数据流
//auds 音频数据流
FOURCC fccHandler;//4字节 ,表示数据流解压缩的驱动程序代号
DWORD dwFlags; //数据流属性
WORD wPriority; //此数据流的播放优先级
WORD wLanguage; //音频的语言代号
DWORD dwInitalFrames;//说明在开始播放前需要多少桢
DWORD dwScale; //数据量,视频每桢的大小或者音频的采样大小
DWORD dwRate; //dwScale /dwRate = 每秒的采样数
DWORD dwStart; //数据流开始播放的位置,以dwScale为单位
DWORD dwLength; //数据流的数据量,以dwScale为单位
DWORD dwSuggestedBufferSize; //建议缓冲区的大小
DWORD dwQuality; //解压缩质量参数,值越大,质量越好
DWORD dwSampleSize; //音频的采样大小
RECT rcFrame; //视频图像所占的矩形
}AVIStreamHeader;
②"strf"子块紧跟在"strh"子块之后,其结构视"strh"子块的类型而定,如下所述;
如果 strh子块是视频数据流,则 strf子块的内容是一个与windows设备无关位图的BIMAPINFO结构,如下:
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1]; //颜色表
}BITMAPINFO;typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER;
如果 strh子块是音频数据流,则strf子块的内容是一个WAVEFORMAT结构,如下:
typedef struct
{
WORD wFormatTag;
WORD nChannels; //声道数
DWORD nSamplesPerSec; //采样率
DWORD nAvgBytesPerSec; //WAVE声音中每秒的数据量
WORD nBlockAlign; //数据块的对齐标志
WORD biSize; //此结构的大小
}WAVEFORMAT
③"strd"子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定结构。
"strl" LIST块定义的AVI数据流依次将 "hdrl " LIST 块中的数据流头结构与"movi" LIST块中的数据联系在一起,第一个数据流头结构用于数据流0,第二个用于数据流1,依次类推。
数据块:存储视频和音频数据流,数据可直接存于 "movi" LIST块中。数据块中音视频数据按不同的字块存放,其结构如下所述,
音频字块
"##wb"
Wave 数据流
视频子块中存储DIB数据,又分为压缩或者未压缩DIB,
"##db"
RGB数据流
"##dc"
压缩的图像数据流
索引块:索引快包含数据块在文件中的位置索引,能提高avi文件的读写速度,其中存放着一组AVIINDEXENTRY结构数据。如下,这个块并不是必需的,也许不存在。
typedef struct
{
DWORD ckid; //记录数据块中子块的标记
DWORD dwFlags; //表示chid所指子块的属性
DWORD dwChunkOffset; //子块的相对位置
DWORD dwChunkLength; //子块长度
};
问题2 :AVI文件中如何实现视音频同步?
在AVI文件中,音频参数中设有同步控制(Synchronization)。在AVI文件中,图像和音频是同步的很好的。但实际上由于CPU处理能力不够,回放AVI时有可能出现图像和音频不同步的现象。当AVI文件的数据率较高,而MPC的处理速度不够时,容易出现图像和音频不同步的现象。如视频中人张嘴说话,但声音没出来。设置同步控制可保证在不同的MPC环境下播放该AVI文件时都能同步。此时播放程序自动地丢掉一些中间帧以保证视频和音频的同步。
WAV文件格式分析
wav概念
WAV(波形声音文件)是最常见的声音文件格式之一,是微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。但WAV文件有一个致命的缺点,就是它所占用的磁盘空间太大(每分钟的音乐大约需要12兆磁盘空间)。它符合资源互换文件格式(RIFF)规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。Wave格式支持MSADPCM、CCITT A律、CCITT μ律和其他压缩算法,支持多种音频位数、采样频率和声道,是PC机上最为流行的声音文件格式;但其文件尺寸较大,多用于存储简短的声音片段。
wav文件结构
WAV文件采用的是RIFF格式结构。至少是由3个块构成,分别是RIFF、fmt 和Data。所有基于压缩编码的WAV文件必须含有fact块。此外所有其它块都是可选的。块fmt,Data及fact均为RIFF块的子块。WAV文件的文件格式类型标识符为“WAVE”。
WAV文件结构 |
RIFF块 |
文件格式类型“WAVE” |
fmt块 |
fact块(压缩编码格式要含有该块) |
data块 |
偏移地址 | 字节数 | 名称 | 内容 |
00H | 4 | ChunkID | “RIFF” |
04H | 4 | ChunkSize | 文件大小 |
08H | 4 | Format | “WAVE” |
0CH | 4 | Subchunk1ID | “fmt” |
10H | 4 | SubchunkSize | 过度字节(不定) |
14H | 2 | AudioFormat | PCM=1(即线性量化)除1之外的值表示某种形式的压缩 |
16H | 2 | NumChannels | 通道数,单声道为1,双声道为2 |
18H | 4 | SampleRate | 采样率 |
1CH | 4 | ByteRate |
波形音频数据传送速率 =通道数*采样率*每样本数据位数/8 |
20H | 2 | BlockAlign | 数据块的调整数=通道数*每样本数据位数/8 |
22H | 2 | BitsPerSample | 每样本的数据位数,表示每个声道中各样本的数据位数。8bits=8,16bits=16 |
24H | 4 | Subchunk2ID | 数据标记符“data” |
28H | 4 | Subchunk2Size |
语音数据的长度 =样本数*通道数*每样本数据位数/8 |
2CH | * | Data | 实际的声音数据 |
以实例分析 ![](/assets/blank.gif)
52 49 46 46为RIFF固定字头
由上面的十六进制数可以算出文件大小=(00 01 B8 24)H+8=(112684)D 字节
与查看文件属性所得出文件大小一致
文件格式为WAVE
“fmt”和过度字节
红框:压缩方式为1:表示为PCM压缩
绿框:通道数为2:表示为双声道
黄框:采样率为:(00 00 AC 44)H=44100Hz
蓝框:波形音频数据传送速率(00 02 B1 10)H
=通道数*采样率*每样本数据位数/8=2*44100*16/8=176400字节/s
红框: 数据块的调整数=通道数*每样本数据位数/8=(00 04)H=2*16/8=4字节
绿框:每样本的数据位数:(00 01)H=16bits
数据标记符“data”
参考文献
avi文件格式详解【转】 - IT小菜鸟 - 博客园 (cnblogs.com)
AVI文件格式详解.docx (book118.com)
WAV_百度百科 (baidu.com)
wav文件格式解析 - longRookie - 博客园 (cnblogs.com)
【数据压缩】WAV文件分析相关推荐
- 数据压缩(三)——AVI文件分析WAV文件分析
一.AVI文件分析 (一).AVI文件音频和视频的数据是如何放置的?交织放置or连续放置? 打开一个AVI格式文件,如下图: 在00000630行文件出现第一个"01wb"代表第一 ...
- AVI文件格式简介与WAV文件分析
AVI文件格式简介与WAV文件分析 AVI文件格式(回答问题) 所有AVI文件至少包含2个必须的LIST Chunk和一个索引Chunk Chunk: LIST Chunk: 小端:数据的低位保存在内 ...
- 数据压缩——WAV文件格式分析
目录 WAV文件概述 WAV文件格式 一.案例分析 二.代码分析 1.建立结构体 2.读取数据段长度 3.结果 参考 WAV文件概述 WAV文件是在PC机上常见且最经典的多媒体音频文件,文件扩展名为W ...
- [数据压缩]WAV文件格式分析及AVI数据结构分析
目录 WAV文件格式分析 WAV概述 WAV文件格式分析 根据实例的WAV文件结构分析 AVI数据结构 音频与视频的数据放置方式 视频帧与音频帧的字节数 参考引用 WAV文件格式分析 WAV概述 Wa ...
- PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式
本文来自: http://blog.csdn.net/jtlyr/article/details/5321884 这里还有介绍一些wav文件的其他网站,记录下: https://ccrma.stanf ...
- Qt 之 WAV文件解析
简介 最近看了一下Qt的处理音频方面的资料,本身利用QAudioInput 和 QAudioOutput 就可以实现录音和播放功能,代码也很简单,但是录音生成的文件并不能用播放器打开,就算更改后缀名也 ...
- 【数据压缩】WAV文件和AVI文件格式分析
一.WAV文件和AVI文件格式简介 WAV的英文全称是Waveform Audio File Format ,它采用 RIFF (Resource Interchange File Format)文件 ...
- 【数据压缩3】WAV格式文件分析
目录 WAV格式文件概述 关于RIFF文件格式 WAV文件内部结构 WAV格式文件具体实例分析 1.RIFF标头部分 2.fmt部分 3.data部分 问题 WAV格式文件概述 Waveform Au ...
- WAV文件C++分析与显示
预备知识: WAV格式说明:http://baike.baidu.com/view/8033.htm 总体思路:分别建立与WAV格式相对应的类: struct RIFF_HEADER { char s ...
最新文章
- 改善代码设计 —— 总结篇(Summary)
- web框架flask(12)——国际化和本地化
- SVG与UML图详解
- 【Nignx】 nginx启动http服务,报错 curl: (56) Recv failure: Connection reset by peer
- 计算机网络(三)计算机网络-物理层 | 物理设备与传输介质(思维导图 | 知识点总结)
- ubuntu21.04安装微信3.2.1(deepin-wine方式)
- android开发app初始化,安卓快速开发框架(一)XBaseAndroid初始化使用
- 元组的相关操作,定义,查找,修改
- 控制系统分析与设计(一):控制系统分类及建模
- b级计算机机房标准,B级电子信息系统机房技术要求国标GB50174–2008
- 【剑指Offer】43. 从 1 到 n 整数中 1 出现的次数
- MongoDB ODM
- C# 汉字转拼音 拼音转汉字 简体繁体互转
- selenium click点击无反应问题解析
- scratch——这个电路仿真工具真不错
- fc安卓模拟器_Win10可以原生使用安卓APP了,模拟器的地位没了!
- smarty引入html,php用Smarty模板生成html文件
- php的核心架构如下图,thinksns 核心架构及目录结构
- 渗透测试-信息打点(红队工具篇)
- 送君千里终须一别,1胜2负,唯一战胜过AlphaGo的人退役了
热门文章
- 打开浏览器,显示网页可能暂时无法连接,或者它已永久性的移动到了新地址
- 德国访问学者签证的材料准备
- Latex中最后一行文献不能对齐
- sand java_我在sand用java写了一个读取wifi密码的程序,该方法由主方法调用,运行没问题,效果也正常,...
- 图分析在大数据时代的应用
- JPGNet: Joint Predictive Filtering and Generative Network for Image Inpainting
- 将Excle表格数据导入数据库
- PGSQL的一些快捷键操作
- 开源商城系统基于SSH2欧斯塔克在线商城系统
- 带赖子的麻将胡牌算法Java_有人讨论下麻将胡牌,出牌算法吗,求思路