AVI 文件格式解析

前言

AVI(Audio Video Interleaved 音频视频交错格式)是一种音视频的封装格式,于1992年由微软公司推出。它用RIFF(Resource Interchange File Format 资源交换文件格式)描述,包括ChunkLIST两种结构。Chunk用来描述(音频/视频/字幕)的数据,包含在movi LIST中:

movi中Chunk标志是4字节的ASCII码标识符dwFourCC("four-character code") :

除了dc,wb,tx之后 ,还需要在其前面添加00,01,02这些数字,表示流的编号,如00dc,01wb,02tx。Chunk长度指出了Chunk内容的长度,这个长度不包括前面4字节的标识符和4字节的Chunk长度,它以小端的方式呈现。 如果Chunk的长度不是偶数,有1个字节的padding。AVI中其他常用FourCC及文件结构列举如下:

LIST其实用来包含Chunks和下一级LIST,一个AVI文件中可能有多个RIFF LIST,RIFF LIST紧接着后面的FourCC如果是"AVI ",表示标准的AVI文件,如果是"AVIX",则表示AVI文件的扩展部分,用来保存超过1G的movi数据,而其他信息则不应该保存在扩展部分的LIST中:

由于AVI格式的历史重要性,常常需要对其进行分析,本文旨在列出要点,以备查预阅需要。

格式分析

AVI的分析工具有:AVIMux_GUI,RIFFspot等。一个AVI格式的视频举例:

MainAVIHeader结构体

AVIStreamHeader结构体

BITMAPINFOHEADER结构体

WAVEFORMAT结构体

可能是WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX结构体中的一个,以下举例:

索引表

AVI格式的索引表不仅是关键帧的索引,它的索引是针对每一条流的每一个Chunk的,也就是说有多少个数据Chunk,就有多少个索引项,因此开销也特别的大。AVI的索引表存在几个版本:

它的FourCC是"idx1",并且放在于movi之后 ,idx1后的长度size,表示索引数组的个数。索引指向的位置其实是真实数据所在的FourCC开始的位置位置,用dwChunkLength来描述这个Chunk的长度。受限于DWORD的字节数,AVI1.0的索引表实际上只能索引到4G范围内,于是有了Open-DML Index的索引表,一种通用的Open-DML Index结构定义:

各字段含义说明:

实际应用中Open-DML Index包含了Upper Level Index(Super Index)、Standard Index和Field Index。

Super Index:

Super Index其实是索引表的索引,它的FourCC是"indx",bIndexSubType是Super index指向的索引类型,0表示指向标准索引,1表示指向场索引。Super Index不是放在movi之后 ,而是放在strf Chunk之后 ,也就是放在文件头部的每条流的描述信息中,它既可以指向索引,也可以指向真实的数据块。指向的索引应位于movi之后,并且它的FourCC应该是"ix01"这样的,这儿的01表示流的编号和dc前面的字符一致。

Standard Index:

单个Standard index只能索引到4G的范围内,wLongsPerEntry取值为2,bIndexSubType设置为0;bIndexType设置为AVI_INDEX_OF_CHUNKS,dwOffset指向数据的起点,绝对位置是qwBaseOffset + dwOffset, dwSize的BIT31位是1表示非关键帧。这个index可以放在movi之后,也可以放在文件头部。

Field Index:

单个Field index只能索引到4G的范围内,wLongsPerEntry取值3,dwOffsetField值为2表示第二个场的偏移量,dwSize的BIT31位是1表示非关键帧。这个index可以放在movi之后,也可以放在文件头部。

AVI时间戳

说了这么多,还没有列出AVI的时间戳计算方式,AVI的时间戳与索引表有关,下面给出一种实现方式。FFMPEG中索引表调用顺序如下:

avformat_open_input->avi_read_header->avi_load_index->avi_read_idx1->av_add_index_entry->ff_add_index_entry

每一个Chunk都有一个索引项,因此,在遍历索引表的时候,就将索引表的时间戳根据前一个索引表的时候戳和dwSampleSize算出来,dwSampleSize异常的时候,每次将索引表的时间戳加1,ffmpeg在AVI中算的是DTS,这个值需要乘以wScale/dwRate,才能得出PTS。ffmpeg在读的时候,去查了每一个表的索引项,索引项的时间戳就等于要读取的Chunk的时间戳。因此没有索引表的AVI播放也是比较麻烦的。总结起来就是:

参考网页:

https://en.wikipedia.org/wiki/Resource_Interchange_File_Format
http://www.daubnet.com/en/file-format-riff

AVI 文件格式解析相关推荐

  1. AVI文件格式解析+AVI文件解析工具

    (转)AVI文件格式解析+AVI文件解析工具 AVI文件解析工具下载地址:http://download.csdn.net/detail/zjq634359531/7556659 AVI(Audio ...

  2. 第三周 AVI文件格式解析

    一.AVI文件简介   AVI英文全称为Audio Video Interleaved,Audio/Video Interleaved(视音频交织),用于采集.编辑.播放的RIFF文件,由信息块,数据 ...

  3. 手机视频文件格式解析之 3GP/MP4

    转载自百度文库 作者: k歌之王      2009-08-23 前言:做完了手机全能播放器的项目, 又要告别几个月来并肩作战,即将去北京发展的Manager zhu.准备把 做过的3GP/FLV/A ...

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

    这里介绍AVI会使用到的数据结构,为了避免翻译引入歧义,决定该部分还是使用英文原文,如后续有时间再进行翻译. AVIMAINHEADER structure The AVIMAINHEADER str ...

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

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

  6. AVI文件格式及相关操作

    AVI格式是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Vi ...

  7. 3GP/MP4 视频文件格式解析及其播放原理(转)

    视频文件格式解析之 3GP/MP4 1. 概述 流行的文件格式背后都有大公司的支持.FLV得益于ADOBE公司推动的网络视频分享风潮,而AVI则是MICROSOFT首创的RIFF即视频和音频交 织在一 ...

  8. 【编解码:AVI格式解析】

    编解码:AVI格式解析 1 音视频及AVI知识 2 最基本的数据单元 3 AVI主要结构介绍 4 AVI主要结构解析 5 总结 1 音视频及AVI知识 一个完整的音视频文件格式有mp4.mov.flv ...

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

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

最新文章

  1. 传输文件过程中遇到异常被中断
  2. arXiv爆款:想了解Attention就看它!清华计图胡事民团队出品
  3. 双显示器设置:如何设置一台电脑两个显示器
  4. 优秀的代码原来是这样分层的
  5. Python与机器视觉(一)安装与环境
  6. 【Elasticsearch】索引 强制合并 缓存 refresh flush 等操作
  7. Redis--位图BitMap
  8. 智能车制作——从元器件、机电系统、控制算法到完整的智能车设计|文末赠书
  9. 腾讯,字节等大厂面试真题汇总,赶快收藏备战金九银十!
  10. vue+element ui设置默认头像
  11. 一个具有多个组件的在线平面图设计 平面图 在线制图
  12. Prometheus 容器化部署,配合Grafan画图工具监控节点
  13. 基于opencv的图片人像移除
  14. Norgen AAV提取剂盒说明书(含特色)
  15. Django 教程之数据库模型
  16. 存储过程常用开关(set命令解析)
  17. xinetd的安装配置
  18. 第45期:动态规划-背包问题
  19. 基于STC89C52RC的交通灯设计
  20. C++基础入门知识:C++命名空间(名字空间)详解

热门文章

  1. Mysql高可用集群搭建(一)一主两从服务搭建
  2. 第十二期 U-Boot工作原理 《路由器就是开发板》
  3. 高德地图怎么添加公司地址标注
  4. 服务器系统如何玩dnf台服,如何通过台服流出的服务端自己架设DNF
  5. 距离你解决小样本/少数据难题,只差这篇文章
  6. Flink菜鸟教程(二)——时间概念
  7. 域名该怎样选_给项目选择域名时我们常犯的几个错误 我们应该如何正确选择域名...
  8. Android 小数点前后字体大小不一致,EditText限制小数点前后位数的实例
  9. 〖全域运营实战白宝书 - 高转化文案速成篇③〗- 高打开率标题型文案的10大黄金法则
  10. Question Retrieval with Distributed Representations and Participant Reputation in Community QA论文笔记