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 实际的声音数据

以实例分析 

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文件分析相关推荐

  1. 数据压缩(三)——AVI文件分析WAV文件分析

    一.AVI文件分析 (一).AVI文件音频和视频的数据是如何放置的?交织放置or连续放置? 打开一个AVI格式文件,如下图: 在00000630行文件出现第一个"01wb"代表第一 ...

  2. AVI文件格式简介与WAV文件分析

    AVI文件格式简介与WAV文件分析 AVI文件格式(回答问题) 所有AVI文件至少包含2个必须的LIST Chunk和一个索引Chunk Chunk: LIST Chunk: 小端:数据的低位保存在内 ...

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

    目录 WAV文件概述 WAV文件格式 一.案例分析 二.代码分析 1.建立结构体 2.读取数据段长度 3.结果 参考 WAV文件概述 WAV文件是在PC机上常见且最经典的多媒体音频文件,文件扩展名为W ...

  4. [数据压缩]WAV文件格式分析及AVI数据结构分析

    目录 WAV文件格式分析 WAV概述 WAV文件格式分析 根据实例的WAV文件结构分析 AVI数据结构 音频与视频的数据放置方式 视频帧与音频帧的字节数 参考引用 WAV文件格式分析 WAV概述 Wa ...

  5. PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式

    本文来自: http://blog.csdn.net/jtlyr/article/details/5321884 这里还有介绍一些wav文件的其他网站,记录下: https://ccrma.stanf ...

  6. Qt 之 WAV文件解析

    简介 最近看了一下Qt的处理音频方面的资料,本身利用QAudioInput 和 QAudioOutput 就可以实现录音和播放功能,代码也很简单,但是录音生成的文件并不能用播放器打开,就算更改后缀名也 ...

  7. 【数据压缩】WAV文件和AVI文件格式分析

    一.WAV文件和AVI文件格式简介 WAV的英文全称是Waveform Audio File Format ,它采用 RIFF (Resource Interchange File Format)文件 ...

  8. 【数据压缩3】WAV格式文件分析

    目录 WAV格式文件概述 关于RIFF文件格式 WAV文件内部结构 WAV格式文件具体实例分析 1.RIFF标头部分 2.fmt部分 3.data部分 问题 WAV格式文件概述 Waveform Au ...

  9. WAV文件C++分析与显示

    预备知识: WAV格式说明:http://baike.baidu.com/view/8033.htm 总体思路:分别建立与WAV格式相对应的类: struct RIFF_HEADER { char s ...

最新文章

  1. 改善代码设计 —— 总结篇(Summary)
  2. web框架flask(12)——国际化和本地化
  3. SVG与UML图详解
  4. 【Nignx】 nginx启动http服务,报错 curl: (56) Recv failure: Connection reset by peer
  5. 计算机网络(三)计算机网络-物理层 | 物理设备与传输介质(思维导图 | 知识点总结)
  6. ubuntu21.04安装微信3.2.1(deepin-wine方式)
  7. android开发app初始化,安卓快速开发框架(一)XBaseAndroid初始化使用
  8. 元组的相关操作,定义,查找,修改
  9. 控制系统分析与设计(一):控制系统分类及建模
  10. b级计算机机房标准,B级电子信息系统机房技术要求国标GB50174–2008
  11. 【剑指Offer】43. 从 1 到 n 整数中 1 出现的次数
  12. MongoDB ODM
  13. C# 汉字转拼音 拼音转汉字 简体繁体互转
  14. selenium click点击无反应问题解析
  15. scratch——这个电路仿真工具真不错
  16. fc安卓模拟器_Win10可以原生使用安卓APP了,模拟器的地位没了!
  17. smarty引入html,php用Smarty模板生成html文件
  18. php的核心架构如下图,thinksns 核心架构及目录结构
  19. 渗透测试-信息打点(红队工具篇)
  20. 送君千里终须一别,1胜2负,唯一战胜过AlphaGo的人退役了

热门文章

  1. 打开浏览器,显示网页可能暂时无法连接,或者它已永久性的移动到了新地址
  2. 德国访问学者签证的材料准备
  3. Latex中最后一行文献不能对齐
  4. sand java_我在sand用java写了一个读取wifi密码的程序,该方法由主方法调用,运行没问题,效果也正常,...
  5. 图分析在大数据时代的应用
  6. JPGNet: Joint Predictive Filtering and Generative Network for Image Inpainting
  7. 将Excle表格数据导入数据库
  8. PGSQL的一些快捷键操作
  9. 开源商城系统基于SSH2欧斯塔克在线商城系统
  10. 带赖子的麻将胡牌算法Java_有人讨论下麻将胡牌,出牌算法吗,求思路