AVI格式解析

AVI格式解析  

http://handsomeboy226.blog.163.com/blog/static/9665175200891373140372/

2008-10-13 19:31:40|  分类: 视频文件格式|字号 订阅

AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video for Windows (简称VFW)环境,现在已被Windows 95/98、OS/2等多数操作系统直接支持。AVI格式允许视频和音频交错在一起同步播放,支持256色和RLE压缩,但AVI文件并未限定压缩标准,因此,AVI文件格式只是作为控制界面上的标准,不具有兼容性,用不同压缩算法生成的AVI文件,必须使用相应的解压缩算法才能播放出来。常用的AVI播放驱动程序,主要是Microsoft Video for Windows或Windows 95/98中的Video 1,以及Intel公司的Indeo Video。

  在介绍AVI文件前,我们要先来看看RIFF文件结构。AVI文件采用的是RIFF文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI 都采用这种格式存储。构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分,

  1、4字节的数据块标记(或者叫做数据块的ID)

  2、数据块的大小

  3、数据

  整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列的子块,其中有一种字块的ID为"LIST",称为LIST,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。

  RIFF和LIST块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下: 

  1、4字节的数据块标记(Chunk ID)

  2、数据块的大小

  3、4字节的形式类型或者列表类型

  4、数据

  下面我们看看AVI文件的结构。AVI文件是目前使用的最复杂的RIFF文件,它能同时存储同步表现的音频视频数据。AVI的RIFF块的形式类型是AVI,它包含3个子块,如下所述:

  1、信息块,一个ID为"hdrl"的LIST块,定义AVI文件的数据格式。

  2、数据块,一个ID为 "movi"的LIST块,包含AVI的音视频序列数据。

  3、索引块,ID为 "idxl"的子块,定义 "movi"LIST块的索引数据,是可选块。

  AVI文件的结构如下图所示,下面将具体介绍AVI文件的各子块构造。

  1、信息块,信息块包含两个子块,即一个ID为 avih 的子块和一个ID 为 strl 的LIST块。


  "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;


  "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文件的图像数据可以是压缩的,和非压缩格式的。对于压缩格式来说,也可采用不同的编码,也许你曾经遇到有些avi没法识别,就是因为编码方式不一样,如果没有相应的解码,你就没法识别视频数据。AVI的编码方式有很多种,比较常见的有 mpeg2,mpeg4,divx等。

索引块,索引快包含数据块在文件中的位置索引,能提高avi文件的读写速度,其中存放着一组AVIINDEXENTRY结构数据。如下,这个块并不是必需的,也许不存在。

typedef struct 
{
 DWORD ckid; //记录数据块中子块的标记
 DWORD dwFlags; //表示chid所指子块的属性
 DWORD dwChunkOffset; //子块的相对位置
 DWORD dwChunkLength; //子块长度
};

*********************************************************************************************************************************************

首先声明:本文的内容都是我从开发过程中总结出来的,以我的理解在尽可能短的篇幅里对 DV AVI 文件的分析作介绍。真要作开发还需要参考原始的文档。

AVI 文件总是以 12 个字节开始的,就是 'RIFF' + size + 'AVI '。这里 size 是一个 4 字节的整数,声明其后的字节数(包括'AVI '这4个字节数)

现在问题就出来了,这样的格式就是限定了 size 的最大取值只能是 4G,后来人们就扩展了 AVI 的结构——当分析到声明的字节数后,如果后面是扩展格式,那么就继续分析。

扩展部分类似 AVI 的格式,只不过从 'AVI ' 变成了 'AVIX',而且可能有多个扩展部分。因此这一部分的分析代码就是:

head = struct.unpack('<4sI4s', avifile.read(12)) if head[0] != 'RIFF' or head[2] != 'AVI ': return None while True: xread = readChunk(avifile, head[1]-4, 0) # 分析剩余的数据 s = avifile.read(12) if 0 == len(s): # 如果没有什么可读的了,自然是分析完了 break head = struct.unpack('<4sI4s', s) if head[0] != 'RIFF' or head[2] != 'AVIX': break

由于 AVI 内部嵌套的数据块的格式也类似 4bytes info + size + data 这样的结构,因此 readChunk 被设计成一个递归函数,返回值为 0 或 -1,中途解析失败就返回 -1,根据此返回值退出嵌套调用。(回过头来看这样一段程序,递归调用分析的可读性很糟糕,主要是因为开始编程的时候对 Python 没有太多的认识所致)

可能是为了便于编程,各个数据块被设计成 4 字节对齐的,但 data 的大小未必是 4 的整数倍,从文件中读出来的 size 只是表示 data 的长度,有时候必须计算对齐。下面两行语句就是作这个的:

page = (head[1] - 1)/4 chunksize = (page + 1) * 4

为了便于播放器去 seek 一个特定的位置,比如从文件的第 12 分 32 秒开始播放,需要一个索引方案可以快速定位到相应的数据。这就是 'idx1' chunk 里面定义的东东。但传统的定义里面偏移量最大只能为 4G,因此扩展格式里面增加了 super index,或者说 index 的 index,里面可以放 longlong 的 64 位整数来避免这种寻址困境,估计在我有生之年都不会有这么大个的数据文件问世。

readChunk 函数的主要功能就是生成一个 index 列表,然后从这个列表的最前面和最后面分别 seek 到相应的数据存储区域,找出时间码。如果发现 AVI 里面有 super index,就在 readChunk 返回后,再根据 super index 生成 index 列表。程序里面这个列表变量名为 offset

分析 DV 格式获取时间的函数是 readtime。DV 可能是每次记录 12000 字节数据(类似磁盘扇区的概念??),因此在每 12000 字节数据里面都会存储一个时间码。我的当时参考的代码里面在每个 index 指向的数据块里循环了 15 次还是 10 次,但我发现我这里只能循环 12 次就碰到了数据的尽头,后来估计是 PAL/NTSC 的差异,也就没有继续追究下去。

转载于:https://www.cnblogs.com/zhgyee/archive/2011/09/29/2195959.html

AVI 文件格式解析 AVI 文件格式解析 前言 AVI(Audio Video Interleaved 音频视频交错格式)是一种音视频的封装格式,于1992年由微软公司推出。它用RIFF(Resource Interchange File Format 资源交换文件格式)描述,包括Chunk和LIST两种结构。Chunk用来描述(音频/视频/字幕)的数据,包含在movi LIST中: Chunk标志是4字节的ASCII码标识符dwFourCC("four-character code"): Chunk... 阅读详情

相关推荐

22、深入解析DMO与AVI文件格式

本文深入解析了DMO(DirectX Media Object)和AVI文件格式的特点、结构及应用。详细介绍了DMO在多媒体开发中的灵活性和可重用性,以及AVI文件格式作为通用容器格式的内部结构和读取处理流程。同时探讨了两者的结合应用,帮助开发者更好地实现视频编辑、音频处理等多媒体功能。

terraform7cloud的博客 169

截取AVI格式的视频C语言代码

首先在阅读本代码之前百度一下avi,虽然经过我验证上面有部分错误,但是不影响阅读。因为有些变量的注释我没有写,所以请读者自行搜索吧。下面是c语言文件,编译之后能够直接运行,用来截取开始时间(单位s)后指定长度(单位s)的视频流。最后附上一部分视频文件的二进制,方便对照阅读。     #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #in...

weixin_38697824的博客 1273

Qt代码-AVI文件包头格式解析

qDebug() << "采样率:" << audioFormat.samplesPerSec << "Hz";qDebug() << "图像大小:" << videoFormat.sizeImage << "字节";qDebug() << "文件总大小:" << riffHeader.fileSize + 8 << "字节";qDebug() << "\n===== 流" << i + 1 << "信息 =====";qDebug() << "声道数:" << audioFormat.channels;

寒寒豆豆软件公司的博客 153

AVI文件格式

小知识:AVI文件格式----摘自《DirectShow实务精选》 作者:陆其明 AVI(Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉、编辑、回放等应用程序中。通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单...

我是传奇 671

AVI文件格式详解与实战解析

AVI(Audio Video Interleaved)是由微软于1992年推出的一种多媒体容器格式,旨在实现音频与视频数据的同步播放。其核心设计思想是将音视频数据交错存储,便于播放器按时间顺序读取与渲染。与其他视频格式如MP4、MKV相比,AVI格式结构相对简单,缺乏扩展性与高压缩支持,但因其历史悠久,广泛兼容于各类播放器与操作系统。在音视频存储与播放中,AVI起到了基础性作用,尤其在早期多媒体应用中占据主导地位。其结构清晰、易于解析的特点,也为后续容器格式的发展提供了参考。

weixin_42430341的博客 2688

解决 PyInstaller 与 `pathlib` 包不兼容的问题

为了避免 PyInstaller 和pathlib包的兼容性问题,最简单的解决办法就是卸载不必要的pathlib包。只需在命令行中运行卸载命令,然后重新打包即可。

Winfredzhang的博客 3225

AVI封装格式解析

AVI封装格式解析

houxiaoni01的博客 5476

DISK配置服务器软RAID工作任务(RAID1+BITLOCKER)-winserver4

DISK配置服务器软RAID工作任务(RAID1+BITLOCKER)-winserver4

新时代先锋的博客 7299

avi 文件格式解析

http://blog.youkuaiyun.com/lxmnet123/article/details/10742503 AVI:Audio/Video Interleaved(视音频交织),用于采集、编辑、播放的RIFF文件。由Microsoft公司1922年11月推出,用于对抗苹果Quicktime技术,AVI现在还在被广泛使用。 RIFF:Resource Interc

penzchan的专栏 1490

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

BMS硬件设计核心:安全、精度与EMC的工程平衡

电池管理系统(BMS)是保障锂电安全运行的关键嵌入式子系统,其本质是在高精度模拟测量、实时故障响应与复杂电磁环境适应性之间达成工程平衡。原理上,BMS依赖专用监测芯片(如BQ76920)实现微秒级硬件保护,结合主控MCU(如STM32)完成策略决策与通信管理,形成‘安全协处理器+智能主控’双架构。技术价值体现在对过压/欠压/过流/温度等多维故障的毫秒级闭环处置能力,支撑SOC/SOH估算可信度与系统鲁棒性。典型应用场景涵盖电动工具、轻型电动车及储能模块等中低串数电池组。本文聚焦BMS控制板在时钟布局、电源滤

weixin_30591519的博客 70

【编解码:AVI格式解析】

编解码:AVI格式解析1 音视频及AVI知识2 最基本的数据单元3 AVI主要结构介绍4 AVI主要结构解析5 总结 1 音视频及AVI知识 一个完整的音视频文件格式有mp4、mov、flv、avi、rmvb、mkv、ts等,它们是封装数据的容器,包括音频、视频、字幕、基础元信息等,通过一些特定的编码算法,对各种信息进行编码压缩过后得到的。视频文件的封装格式并不影响视频的画质,影响视频画面质量的是视频的编码格式。 H264、HEVC、VP9、AV1等就是视频编码格式,MP3、AAC、AC-3等就是音频编码格

weixin_47852035的博客 1万+

基于STM32L4XX、HAL库的MP2672GD-0000-Z充电芯片驱动程序设计

CHG_STAT_GPIO_Port, CHG_STAT_Pin, // 这些宏应由 CubeMX 生成在 main.h。

zhusl6688的博客 497

avi文件格式解析

在做视频浓缩(视频摘要)项目时,我们希望按浓缩视频的文件名进行查找,进行重复播放该视频。然而, 由于前期生成的浓缩视频是以时间(年-月-日 小时分秒)命名的,对用户通常来说难以记忆,用户极有可能更改为方便自己记忆的文件名。这样,如果我们还是按照之前的时间去读取视频文件,由于文件名已经被修改,将无法读取文件。经讨论,我们考虑将时间直接写在AVI文件内部,但必须保证不破坏原有AVI文件的格式而导致文件

令狐少侠 2117

FC7300 SPI MCAL配置引导

Example - QMI8A01z外设:Example - QMI8A01z外设:

舊梦的博客 258

032、准谐振反激变换器(QR-Flyback)原理

文章摘要: 本文以65W PD快充炸管案例切入,解析准谐振反激变换器(QR-Flyback)原理。通过主动利用漏感与MOS结电容的谐振,在Vds波谷开通实现近似ZVS,显著降低开关损耗与电压应力。对比传统反激,QR模式轻载效率提升8%,Vds尖峰减少23%。关键设计要点包括:变压器漏感需<3%、谷底检测电路需抗干扰、启动阶段需防过冲。推荐NCP1340等专用控制芯片,并强调VCC电容优选低ESR陶瓷材质。QR适用于30W-150W场景,其核心优势在于轻载效率优化,但需平衡漏感控制与可靠性。作者结合实测数据与

Jack010169的博客 116

第三周 AVI文件格式解析

数据压缩第三次作业

awaaaaa_的博客 1145

YOLOv12中的A2C2f模块详解,涉及区域注意力模块(A2)和 R-ELAN 结构详解

区域注意力模块(Area Attention, A2)的设计出发点是为了解决传统注意力机制在计算复杂度和内存访问效率上的问题。传统的自注意力机制(Self-Attention)具有二次方的计算复杂度(O(n²)),尤其是在处理高分辨率图像时,计算成本非常高。此外,注意力机制的内存访问模式不如卷积神经网络高效,导致在实际应用中难以满足实时性要求。区域注意力模块通过将特征图划分为多个区域,并在每个区域内进行注意力计算,从而显著降低了计算复杂度。

Limiiiing的博客 5514

AVI文件格式解析

主要看这篇文章: https://blog.youkuaiyun.com/chenyonken/article/details/79174500 这是一个具体的AVI文件二进制打开的情况

weixin_43360707的博客 2969

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

AVI音视频封装格式学习(三)——AVI 数据结构解析

这里介绍AVI会使用到的数据结构,为了避免翻译引入歧义,决定该部分还是使用英文原文,如后续有时间再进行翻译。 AVIMAINHEADER structure The AVIMAINHEADER structure defines global information in an AVI file. typedef struct _avimainheader { F...

Biao 5123

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

二进制 AVI格式解析

52 49 46 46 -> FORCC码'RIFF'的ASCII值,说明是一个RIFF文件。RIFF( resource interchange file format ) 。 84 CF 4A 00 -> 表示文件大小的4个字节,由于windows是小头的,所以文件大小为0x004ACF84,即4902788字节,由于该size不包含开头的8字节,所以文件总大小为4902796字节 41

2667

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AVI格式详细解析

摘要:本文详细的解析了AVI文件的存储结构,介绍了微软提供的用来操作AVI文件的一组API使用方法,并通过例子代码,演示了如何将一组静态Bmp图片合成一个avi视频文件以及如何将一个avi视频文件解析保存为一系列的bmp图像文件。   AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文

penzchan的专栏 6651

(转)AVI文件格式解析+AVI文件解析工具

    AVI文件解析工具下载地址:http://download.youkuaiyun.com/detail/zjq634359531/7556659     AVI(Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉、编辑、回放等应用程序中。通常情况下,一个AVI文件可以包含多个不同类型...

weixin_34242658的博客 139

C++解析AVI文件格式学习总结

一、AVI简介 AVI英文全称为Audio Video Interleaved,即音频视频交错格式,一种多媒体容器格式。AVI文件将音频和视频 包含在一个文件容器中,允许音视频同步回放。 AVI 1.0 由于索引地址与大小用4字节表示,所以最大支持4G容量,而且与文件系统类型有关;  AVI 2.0 AVI的扩展格式,解决AVI 1.0大小限制; 本文主要分析AVI 1.0,H2

Sunny的博客 4876

mpv容器格式支持:MKV、MP4、AVI格式解析

> 还在为视频播放器对不同格式的支持差异而烦恼?mpv作为一款强大的命令行视频播放器,在容器格式支持方面表现出色。本文将深入解析mpv对MKV、MP4、AVI三大主流容器格式的完整支持机制。 ## 容器格式基础概念 容器格式(Container Format)是多媒体文件的基础结构,它定义了如何存储音频、视频、字幕等数据流以及相关的元数据信息。与编解码器不同,容器格式负责数据的组织和封装。 ...

gitblog_00336的博客 1201
上一篇: FFMPEG数据结构解释
下一篇: Proc信息详解
aobo1237
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值