AVI格式的详细分析

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... 阅读详情

AVI (Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉、编辑、回放等应用程序中。通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单一音频流或单一视频流的AVI文件也是合法的。AVI可以算是Windows操作系统上最基本的、也是最常用的一种媒体文件格式。

先来介绍RIFF文件格式。RIFF文件使用四字符码FOURCC(four-character code)来表征数据类型,比如‘RIFF’、‘AVI ’、‘LIST’等。注意,Windows操作系统使用的字节顺序是little-endian,因此一个四字符码‘abcd’实际的DWORD值应为 0x64636261。另外,四字符码中像‘AVI ’一样含有空格也是合法的。

RIFF 文件首先含有一个文件头结构。其中,最开始的4个字节是一个四字符码‘RIFF’,表示这是一个RIFF文件;紧跟着后面用4个字节表示此RIFF文件的大小;然后又是一个四字符码说明文件的具体类型(比如AVI、WAVE等);最后就是实际的数据。注意文件大小值的计算方法为:实际数据长度 + 4(文件类型域的大小);也就是说,文件大小的值不包括‘RIFF’域和“文件大小”域本身的大小。

RIFF 文件的实际数据中,通常还使用了列表(List)和块(Chunk)的形式来组织。列表可以嵌套子列表和块。其中,列表的结构为:‘LIST’ listSize listType listData ——‘LIST’是一个四字符码,表示这是一个列表;listSize占用4字节,记录了整个列表的大小;listType也是一个四字符码,表示本列表的具体类型;listData就是实际的列表数据。注意listSize值的计算方法为:实际的列表数据长度 + 4(listType域的大小);也就是说listSize值不包括‘LIST’域和listSize域本身的大小。再来看块的结构:ckID ckSize ckData ——ckID是一个表示块类型的四字符码;ckSize占用4字节,记录了整个块的大小;ckData为实际的块数据。注意ckSize值指的是实际的块数据长度,而不包括ckID域和ckSize域本身的大小。(注意:在下面的内容中,将以LIST ( listType ( listData ) )的形式来表示一个列表,以ckID ( ckData )的形式来表示一个块,如[ optional element ]中括号中的元素表示为可选项。)

接下来介绍AVI文件格式。AVI文件类型用一个四字符码‘AVI ’来表示。整个AVI文件的结构为:一个RIFF头 + 两个列表(一个用于描述媒体流格式、一个用于保存媒体流数据) + 一个可选的索引块。AVI文件的展开结构大致如下:

 

RIFF (‘AVI ’
      LIST (‘hdrl’
            ‘avih’(主AVI信息头数据)
            LIST (‘strl’
                  ‘strh’ (流的头信息数据)
                  ‘strf’ (流的格式信息数据)
                  [‘strd’ (可选的额外的头信息数据) ]
                  [‘strn’ (可选的流的名字) ]
                  ...
                 )
             ...
           )
      LIST (‘movi’
            { SubChunk | LIST (‘rec ’
                              SubChunk1
                              SubChunk2
                              ...
                             )
               ...
            }
            ...
           )
      [‘idx1’ (可选的AVI索引块数据) ]
     )

 

首先,RIFF (‘AVI ’…)表征了AVI文件类型。然后就是AVI文件必需的第一个列表——‘hdrl’列表,用于描述AVI文件中各个流的格式信息(AVI文件中的每一路媒体数据都称为一个流)。‘hdrl’列表嵌套了一系列块和子列表——首先是一个‘avih’块,用于记录AVI文件的全局信息,比如流的数量、视频图像的宽和高等,可以使用一个AVIMAINHEADER数据结构来操作:

 

typedef struct _avimainheader {
    FOURCC fcc;   // 必须为‘avih’
    DWORD  cb;    // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
    DWORD  dwMicroSecPerFrame;   // 视频帧间隔时间(以毫秒为单位)
    DWORD  dwMaxBytesPerSec;     // 这个AVI文件的最大数据率
    DWORD  dwPaddingGranularity; // 数据填充的粒度
    DWORD  dwFlags;         // AVI文件的全局标记,比如是否含有索引块等
    DWORD  dwTotalFrames;   // 总帧数
    DWORD  dwInitialFrames; // 为交互格式指定初始帧数(非交互格式应该指定为0)
    DWORD  dwStreams;       // 本文件包含的流的个数
    DWORD  dwSuggestedBufferSize; // 建议读取本文件的缓存大小(应能容纳最大的块)
    DWORD  dwWidth;         // 视频图像的宽(以像素为单位)
    DWORD  dwHeight;        // 视频图像的高(以像素为单位)
    DWORD  dwReserved[4];   // 保留
} AVIMAINHEADER;

 

然后,就是一个或多个‘strl’子列表。(文件中有多少个流,这里就对应有多少个‘strl’子列表。)每个‘strl’子列表至少包含一个‘strh’ 块和一个‘strf’块,而‘strd’块(保存编解码器需要的一些配置信息)和‘strn’块(保存流的名字)是可选的。首先是‘strh’块,用于说明这个流的头信息,可以使用一个AVISTREAMHEADER数据结构来操作:

 

typedef struct _avistreamheader {
     FOURCC fcc;  // 必须为‘strh’
     DWORD  cb;   // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
FOURCC fccType;    // 流的类型:‘auds’(音频流)、‘vids’(视频流)、
                   //‘mids’(MIDI流)、‘txts’(文字流)
     FOURCC fccHandler; // 指定流的处理者,对于音视频来说就是解码器
     DWORD  dwFlags;    // 标记:是否允许这个流输出?调色板是否变化?
     WORD   wPriority;  // 流的优先级(当有多个相同类型的流时优先级最高的为默认流)
     WORD   wLanguage;
     DWORD  dwInitialFrames; // 为交互格式指定初始帧数
     DWORD  dwScale;   // 这个流使用的时间尺度
     DWORD  dwRate;
     DWORD  dwStart;   // 流的开始时间
     DWORD  dwLength;  // 流的长度(单位与dwScale和dwRate的定义有关)
     DWORD  dwSuggestedBufferSize; // 读取这个流数据建议使用的缓存大小
     DWORD  dwQuality;    // 流数据的质量指标(0 ~ 10,000)
     DWORD  dwSampleSize; // Sample的大小
     struct {
         short int left;
         short int top;
         short int right;
         short int bottom;
}  rcFrame;  // 指定这个流(视频流或文字流)在视频主窗口中的显示位置
             // 视频主窗口由AVIMAINHEADER结构中的dwWidth和dwHeight决定
} AVISTREAMHEADER;

 

然后是‘strf’块,用于说明流的具体格式。如果是视频流,则使用一个BITMAPINFO数据结构来描述;如果是音频流,则使用一个WAVEFORMATEX数据结构来描述。


当AVI 文件中的所有流都使用一个‘strl’子列表说明了以后(注意:‘strl’子列表出现的顺序与媒体流的编号是对应的,比如第一个‘strl’子列表说明的是第一个流(Stream 0),第二个‘strl’子列表说明的是第二个流(Stream 1),以此类推),‘hdrl’列表的任务也就完成了,随后跟着的就是AVI文件必需的第二个列表——‘movi’列表,用于保存真正的媒体流数据(视频图像帧数据或音频采样数据等)。那么,怎么来组织这些数据呢?可以将数据块直接嵌在‘movi’列表里面,也可以将几个数据块分组成一个‘rec ’列表后再编排进‘movi’列表。(注意:在读取AVI文件内容时,建议将一个‘rec ’列表中的所有数据块一次性读出。)但是,当AVI文件中包含有多个流的时候,数据块与数据块之间如何来区别呢?于是数据块使用了一个四字符码来表征它的类型,这个四字符码由2个字节的类型码和2个字节的流编号组成。标准的类型码定义如下:‘db’(非压缩视频帧)、‘dc’(压缩视频帧)、‘pc’(改用新的调色板)、‘wb’(音缩视频)。比如第一个流(Stream 0)是音频,则表征音频数据块的四字符码为‘00wb’;第二个流(Stream 1)是视频,则表征视频数据块的四字符码为‘00db’或‘00dc’。对于视频数据来说,在AVI数据序列中间还可以定义一个新的调色板,每个改变的调色板数据块用‘xxpc’来表征,新的调色板使用一个数据结构AVIPALCHANGE来定义。(注意:如果一个流的调色办中途可能改变,则应在这个流格式的描述中,也就是AVISTREAMHEADER结构的dwFlags中包含一个AVISF_VIDEO_PALCHANGES标记。)另外,文字流数据块可以使用随意的类型码表征。


最后,紧跟在‘hdrl’列表和‘movi’列表之后的,就是AVI文件可选的索引块。这个索引块为AVI文件中每一个媒体数据块进行索引,并且记录它们在文件中的偏移(可能相对于‘movi’列表,也可能相对于AVI文件开头)。索引块使用一个四字符码‘idx1’来表征,索引信息使用一个数据结构来 AVIOLDINDEX定义。

 

typedef struct _avioldindex {
   FOURCC  fcc;  // 必须为‘idx1’
   DWORD   cb;   // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)
   struct _avioldindex_entry {
      DWORD   dwChunkId;   // 表征本数据块的四字符码
      DWORD   dwFlags;     // 说明本数据块是不是关键帧、是不是‘rec ’列表等信息
      DWORD   dwOffset;    // 本数据块在文件中的偏移量
      DWORD   dwSize;      // 本数据块的大小
  } aIndex[]; // 这是一个数组!为每个媒体数据块都定义一个索引信息
} AVIOLDINDEX;

 

注意:如果一个AVI文件包含有索引块,则应在主AVI信息头的描述中,也就是AVIMAINHEADER结构的dwFlags中包含一个AVIF_HASINDEX标记。


还有一种特殊的数据块,用一个四字符码‘JUNK’来表征,它用于内部数据的队齐(填充),应用程序应该忽略这些数据块的实际意义。

 

利用VC++实现AVI文件的合成和分解  摘要:本文详细的解析了AVI文件的存储结构,介绍了微软提供的用来操作AVI文件的一组API使用方法,并通过例子代码,演示了如何将一组静态Bmp图片合成一个avi视频文件以及如何将一个avi视频文件解析保存为一系列的bmp图像文件。 关键词:avi文件 bmp图像 vc AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司 阅读详情

相关推荐

【数据压缩3】AVI文件格式分析及问题回答+WAV文件格式分析

目录AVI文件问题回答1.AVI文件音频和视频的数据是如何放置的,交织放置还是连续放置?2.AVI文件一个视频帧大约占据多少字节?一个音频数据块大约占用多少字节?WAV文件格式分析文件概述文件格式RIFF区块FORMAT区块Data区块 AVI文件问题回答 1.AVI文件音频和视频的数据是如何放置的,交织放置还是连续放置? (1)定义:AVI英文全称为Audio Video Interleaved,即音频视频交错格式,是微软公司于1992年11月推出、作为其Windows视频软件一部分的一种多媒体容器格式。

ppinecone的博客 785

【编解码: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万+

数据压缩作业三:AVI和WAV文件格式分析

AVI和WAV文件格式分析

m0_49007394的博客 712

AVI文件格式详解

一、文件格式简介 AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video Windows(简称VFW)环境,现在已被Windows95/98,OS/2等多数操作系统直接支持。AVI格式允许视频和音频交错在一起同步播放,支持2...

Jayson 博客 1万+

13种测试视频格式avi,wmv,mkv,mp4,mov,rm,3gp,flv,mpg,rmvb等

多种格式的测试视频

avi文件分析工具和测试文件.zip

内容包含avi文件分析工具和测试avi格式文件

AVI文件在opencore框架下的解析

<br />AVI文件在opencore框架下的解析<br /><br />     参考相关文档及opencore中pv_avifile_parse等实现,分析opencore下AVI文件解析的实现过程。<br /><br /> 1. AVI容器介绍<br />     AVI是微软1992年推出用于对抗苹果Quicktime的技术,尽管国际学术界公认AVI已经属于被淘汰的技术,但是由于windows的通用性,和简单易懂的开发API,还在被广泛使用。<br />   AVI的文件结构分为头部、主体

uBar_Multimedia Dev. and Data mining (CodeCore) 3068

各种格式测试视频(.avi.wmv.mkv.mp4.mov.rm)

各种格式测试视频

解决:信息中插入avi格式的视频时,提示“unsupported video format”

【測试步骤】:新建信息。加入AVI格式的视频 【測试结果】:加入时弹出提示“unsupported video format” 该问题主要提如今手机彩信视频附件不支持该AVI格式的视频,因此我们通过操作流程对代码进行追踪,查找“unsupported video format”产生的位置。 我们从加入附件界面ComposeMessageActivity类的onActivityResu...

weixin_34295316的博客 632

12种测试视频文件

12中测试视频,mp4,mpeg,avi等格式的测试视频,方便做媒体开发用来做测试

10种常见格式的测试视频

10种常见格式的测试视频,作为测试使用,10种常见格式的测试视频

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

WAV文件格式分析 WAV概述 Waveform Audio File Format(WAVE),后缀采用WAV,采用Resource Interchange File Format(RIFF)文件格式结构。通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。 WAV文件格式分析 WAV文件遵循RIFF规则,其内容以区块chunk为最小单位进行存储。WAV文件一般由3个区块组成RIFFchunk、Format...

lii_by的博客 3121

STM32 HAL库ADC+DMA配置详解:从CubeMX到实战调试

在嵌入式系统开发中,模数转换器(ADC)是实现传感器数据采集、信号处理等功能的基石。其工作原理是将连续的模拟信号转换为离散的数字量,为微控制器(MCU)提供可处理的数字信息。为了提升系统效率,直接存储器访问(DMA)技术被引入,它作为独立于CPU的数据搬运工,能在不占用CPU资源的情况下,自动完成外设与内存间的数据传输,从而解放CPU以执行更复杂的控制算法或通信任务。这种ADC与DMA的协同工作模式,对于实现高效、实时的数据流处理具有重要价值,广泛应用于电机控制、环境监测、音频处理等场景。本文聚焦于STM3

weixin_30698297的博客 408

AVI视频格式分析-封装格式

avi 是视频的一种封装格式,如果的数据可以是多种变化的,音频编码可以是PCM,也可以 是mp3,视频的编码可以是H.26,也可以是MPEG-4

一个专研技术的小蜜蜂的博客 1297

OpenWrt kmod内核不兼容?手把手教你用脚本强制安装驱动模块(附国内镜像源)

本文详细解决了OpenWrt kmod内核不兼容问题,提供智能脚本强制安装驱动模块的方法,并附有国内镜像源加速配置。通过自动化脚本修改内核MD5校验值,确保kmod包正常安装,同时推荐多个国内镜像源以提升下载速度。

weixin_42549451的博客 542

华北理工大学以升实验班蓝桥杯选拔赛题解

文章目录华北理工大学以升实验班蓝桥杯选拔赛题解A:期末考试题目描述题目讲解代码B:月份题目描述题目讲解代码C:打饭题目描述题目讲解代码D : 正弦波信号题目描述题目讲解代码E : 亲爱的长方形题目描述题目讲解代码F:挖金子题目描述题目讲解代码G : 金金的游戏题目描述题目讲解代码H : 区间和题目描述题目讲解代码详细视频讲解请关注华北理工大学b站账号。 华北理工大学以升实验班蓝桥杯选拔赛题解 A:期末考试 题目描述 Description 期末考试过去许多天了,如今成绩都出来了,那么现在让我们对成绩我分个类

Qq1739206233的博客 1128

gstreamer avidemux增加h265支持

AVI文件采用的是RIFF文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用户管理Windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI都采用这种格式存储。RIFF文件的实际数据中,使用了列表(List)和块(Chunk)的形式来组织。列表可以嵌套列表和块。整个RIFF文件可以看成一个数据库,其数据块ID为RIFF ,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。

技术笔记 1606

【Unity】Pico VR 开发实战:从环境搭建到交互实现

本文是一份详细的Unity Pico VR开发实战指南,涵盖从环境搭建到核心交互实现的全流程。详细讲解了如何集成Pico Unity Integration SDK与XR Interaction Toolkit,配置开发环境,并重点解析了手柄输入处理、射线交互以及VR UI操作三大核心模块的代码实现与优化技巧,帮助开发者快速上手Pico VR应用开发。

rice5的博客 1177

AVI和WAV格式文件分析

AVI格式 AVI英文全称为Audio Video Interleaved,即音频视频交错格式,是微软公司于1992年11月推出、作为其Windows视频软件一部分的一种多媒体容器格式。 AVI文件将音频(语音)和视频(影像)数据包含在一个文件容器中,允许音视频同步回放。类似DVD视频格式,AVI文件支持多个音视频流。AVI信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。 AVI文件类型用一个四字符码‘AVI ’来表示。整个AVI文件的结构为:一个RIFF头 + ...

BIN_markie的博客 1310

【人工智能AI】是什么?

人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟延伸和扩展人的智能的理论方法技术及应用系统的一门新的技术科学。(百度百科)人工智能的基本原理:机器从「特定的」大量数据中总结规律,形成某些「特定的知识」,然后将这种「知识」应用到现实场景中去解决实际问题。在这个基本原理的基础上,有3个特征:1、人工智能本质上是一种工具2、人工智能技能只能解决特定的问题,而不是什么都能做3、人工智能属于归纳逻辑,可以告诉你是什么,但是不能告诉你为什么。

KJCZ.AK的博客 2万+

matlab 点云按高程进行赋色【2024最新版】

首先按照Z轴方向求取所在点云的高程极值(包括高程最大值与最小值),然后将高程归一化到0~255范围内,最后采用matlab中的colormap颜色渲染函数进行赋色并保存渲染结果到点云。

点云侠的博客 3341

WAV文件格式分析(附AVI文件格式分析)

WAV格式,AVI格式

weixin_47005361的博客 2421

【YOLO系列】YOLOv4详解:模型结构、损失函数、训练方法及代码实现

摘要:YOLOv4在目标检测领域实现了精度与速度的平衡,通过CSPDarknet53骨干网络、SPP+PANet特征融合及CIoU损失函数等创新,在MS COCO数据集达到65.7% AP50,V100显卡实现62FPS实时检测。核心优化包括Mosaic数据增强、自对抗训练和解耦头结构,显著提升小目标检测和遮挡场景鲁棒性。代码实现采用CSP模块和SPP多尺度池化,兼顾计算效率与检测性能,为工业落地提供高效解决方案。(149字)

一碗白开水一 1358
上一篇: Flash格式的解析
下一篇: 荷兰国旗问题、矩阵相乘之Strassen算法
小人物2014
博客等级 码龄19年 66粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值