AVI文件结构分析及举例验证
目录
- 一、AVI文件简介
- 二、RIFF头
- 三、LIST列表
- 3.1 hdrl列表
- 3.1.1 avih块
- 3.1.2 strl子列表
- 3.1.2.1 strh块
- 3.1.2.2 strf块
- 3.2 movi列表
- 四、AVI索引块
- 课程问题
- 参考资料
一、AVI文件简介
AVI英文全称为Audio Video Interleaved,即音频视频交错格式,是微软公司于1992年11月推出、作为其Windows视频软件一部分的一种多媒体容器格式。
AVI文件将音频(语音)和视频(影像)数据包含在一个文件容器中,允许音视频同步回放。类似DVD视频格式,AVI文件支持多个音视频流。AVI信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。
AVI文件格式是基于RIFF(资源交换文件格式)文档格式。RIFF文件由RIFF标头组成,后跟零个或多个列表和区块
RIFF标头具有以下形式:
'RIFF' fileSize fileType (data)
其中,“RIFF"是文本 FOURCC 代码"RIFF”,是一个 4 字节值,表示文件中数据的大小,是标识特定文件类型的
fileSize
fileType
FOURCC。 的值包括 FOURCC 的大小以及以下数据的大小,但不包括fileSize
fileType
"RIFF"FOURCC 的大小或 的大小 fileSize 。 文件数据按任何顺序由区块和列表组成。RIFF区块具有以下形式:
ckID ckSize ckData
其中,“ckID”是标识区块中包含的数据的 FOURCC,是一个 4 字节值,表示 中数据的大小,是
ckID
ckSize
ckData
ckData
零个或多个数据字节。 数据始终填充到最近的 WORD 边界。ckSize
提供区块中有效数据的大小;它不包括填充、的大小ckID
或 的大小ckSize
。RIFF列表具有以下形式:
'LIST' listSize listType listData
其中,“LIST"是文本 FOURCC 代码"LIST”,是提供列表大小的 4 字节值,是 FOURCC 代码,由区块或列表组成(
listSize
listType
按任何listData
顺序)。"LIST"的值包括listSize
的大小加上 的大小listType
listData
;它不包括 “LIST” FOURCC 或 的大小listSize
。
本部分的其余部分使用下列表示法来描述 RIFF 区块:
ckID ( ckData )
其中区块大小是隐式的。 使用此表示法,列表可以表示为:
'LIST' ( listType ( listData ) )
可选元素位于方括号中: [ optional element ]
AVI文件结构:
RIFF ('AVI 'LIST ('hdrl''avih'(<Main AVI Header>)LIST ('strl''strh'(<Stream header>)'strf'(<Stream format>)[ 'strd'(<Additional header data>) ][ 'strn'(<Stream name>) ]...)...)LIST ('movi'{SubChunk | LIST ('rec 'SubChunk1SubChunk2...)...}...)['idx1' (<AVI Index>) ])
二、RIFF头
结构
- "RIFF"表示字符串
- RIFF大小
- 形式类型或者列表类型
- 数据
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
FOURCC 代码 | 4 | 0x52 49 46 46 | “RIFF” |
大小 | 4 | 大小=实际数据长度+4 | |
形式类型或列表类型 | 4 | 0x41 56 49 20 | “AVI” |
数据 |
验证:
三、LIST列表
结构
- “LIST”表示字符串
- LIST列表大小
- 形式类型或者列表类型
- LIST实际数据
名称 | 字节数 | 值 | 说明 |
---|---|---|---|
FOURCC 代码 | 4 | 0x4C 49 53 54 | “LIST” |
列表大小 | 4 | 大小=实际列表数据长度+4 | |
形式类型或列表类型 | 4 |
0x68 64 72 6C 或 0x6D 6F 76 69 |
“hdrl” 或 ”movi“ |
数据 |
里面可能包含LIST嵌套 LIST里面音频视频分开存放 |
"hdrl"列表: 用于描述AVI文件中各个流的格式信息(AVI文件中的每一路媒体数据都称为一个流)。此列表里嵌套了一系列块和子列表。块中包含一个
avih
块,用于记录AVI文件的全局信息。子列表中包含一个或多个strl
子列表。文件中有多少流,就对应多少个strl
子列表,一般有视频流和音频流。
"movi"列表: 用于保存真正的媒体流数据,视频图像帧数据或音频采样数据等
验证
3.1 hdrl列表
3.1.1 avih块
avih块用于记录AVI文件的全局信息,比如流的数量、视频图像的宽和高等。
avih块结构: AVIMAINHEADER数据结构
typedef struct _avimainheader {undefinedFOURCC 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;
验证
3.1.2 strl子列表
每个strl子列表至少包含一个
strh
块和一个strf
块,还可以包含strd
块(保存编解码器需要的一些配置信息)和strn
块(保存流的名字)。
3.1.2.1 strh块
strh块主要是说明流的头信息。
strh块结构: AVISTREAMHEADER数据结构
typedef struct _avistreamheader {undefinedFOURCC 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 {undefinedshort int left;short int top;short int right;short int bottom;
} rcFrame; // 指定这个流(视频流或文字流)在视频主窗口中的显示位置// 视频主窗口由AVIMAINHEADER结构中的dwWidth和dwHeight决定
} AVISTREAMHEADER;
3.1.2.2 strf块
strf块用于说明流的具体格式,分为视频流,音频流。
strf块结构:
视频流结构: BITMAPINFO数据结构
typedef struct tagBITMAPINFO{BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors[1]; //颜色表 }BITMAPINFO;typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //本结构的长度,为40个字节。LONG biWidth; //位图的宽度,以像素为单位。 LONG biHeight; //位图的高度,以像素为单位。 WORD biPlanes; //目标设备的级别,必须是1。 WORD biBitCount; //每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16色图)、8(256色)、24(真彩色图),新的BMP格式支持32位色。 DWORD biCompression; //位图压缩类型,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为Windows定义常量)。 DWORD biSizeImage; //实际的位图数据占用的字节数 LONG biXPelsPerMeter; //指定目标设备的水平分辨率 LONG biYPelsPerMeter; //指定目标设备的垂直分辨率 DWORD biClrUsed; //位图实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂 DWORD biClrImportant; //位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。 } BITMAPINFOHEADER;
音频流结构: WAVEFORMATEX数据结构
typedef struct {undefinedWORD wFormatTag; //设置波形声音的格式,更多的信息请参考说明部分。WORD nChannels; //设置音频文件的通道数量,对于单声道的声音,此此值为1。对于立体声,此值为2.DWORD nSamplesPerSec; //设置每个声道播放和记录时的样本频率。DWORD nAvgBytesPerSec; //设置请求的平均数据传输率,单位byte/s。这个值对于创建缓冲大小是很有用的。WORD nBlockAlign; //以字节为单位设置块对齐。块对齐是指最小数据的原子大小。WORD wBitsPerSample; //根据wFormatTag的类型设置每个样本的位深(即每次采样样本的大小,以bit为单位)。WORD cbSize; //额外信息的大小,以字节为单位,额外信息添加在WAVEFORMATEX结构的结尾。 } WAVEFORMATEX; *PWAVEFORMATEX;
3.2 movi列表
movi列表保存的是真正的媒体流数据,其数据组织方式有两种。可以将数据块直接嵌在
movi
列表里面,也可以将几个数据块分组成一个rec
列表后再编排进movi
列表。
数据块使用了一个四字符码来表征它的类型,这个四字符码由2个字节的类型码和2个字节的流编号组成。标准的类型码定义如下:db
(非压缩视频帧)、dc
(压缩视频帧)、pc
(改用新的调色板)、wb
(音缩视频)。比如第一个流(Stream 0)是音频,则表征音频数据块的四字符码为00wb
;第二个流(Stream 1)是视频,则表征视频数据块的四字符码为00db
或00dc
。
四、AVI索引块
AVI索引块 使用
idx1
来表征。
索引块结构: AVIOLDINDEX数据结构
typedef struct _avioldindex {undefinedFOURCC fcc; // 必须为‘idx1’DWORD cb; // 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)struct _avioldindex_entry {undefinedDWORD dwChunkId; // 表征本数据块的四字符码DWORD dwFlags; // 说明本数据块是不是关键帧、是不是‘rec’列表等信息DWORD dwOffset; // 本数据块在文件中的偏移量DWORD dwSize; // 本数据块的大小} aIndex[]; // 这是一个数组!为每个媒体数据块都定义一个索引信息
} AVIOLDINDEX;
课程问题
音频和视频的数据是如何放置的?交织放置 or连续放置?
答:AVI文件中,音频和视频的数据是交织放置。
一个视频帧大约占据多少字节?一个音频数据块大约占用多少字节?
视频帧长为0x0001D4C0
,即为120000字节。
音频帧长为0x0002D5B8
,即为185784字节。
参考资料
[1] : http://t.csdn.cn/zpOgP
[2] : http://t.csdn.cn/Uatey
[3] : https://docs.microsoft.com/zh-cn/windows/win32/directshow/avi-riff-file-reference
AVI文件结构分析及举例验证相关推荐
- 把videos对应标签的.avi文件转为kinetics400的格式,其中所包含的格式有.csv和.json格式
实现功能 把videos对应标签的.avi文件转为kinetics400的格式,其中所包含的格式有.csv和.json格式 https://github.com/yanyide123/kinetics ...
- [数据压缩]WAV文件格式分析及AVI数据结构分析
目录 WAV文件格式分析 WAV概述 WAV文件格式分析 根据实例的WAV文件结构分析 AVI数据结构 音频与视频的数据放置方式 视频帧与音频帧的字节数 参考引用 WAV文件格式分析 WAV概述 Wa ...
- AVI文件规范(更新版)
AVI文件规范 本文主要参考了如下资料: http://blog.csdn.net/sunshine1314/archive/2007/10/14/1824432.aspx 格式规范 http://b ...
- VS2013 解决方案文件结构分析
VS2013 解决方案文件结构分析 参考文章: (1)VS2013 解决方案文件结构分析 (2)https://www.cnblogs.com/haogj/p/4248030.html 备忘一下.
- vc++实现avi文件的操作 用于视频解析及录制(转)
vc++实现avi文件的操作 为了对avi进行读写,微软提供了一套API,总共50个函数,他们的用途主要有两类,一个是avi文件的操作,一类是数据流streams的操作. 1.打开和关闭文件 AVIF ...
- H264 数据avi文件封装和拆解
from: http://blog.csdn.net/zhujinghao_09/article/details/44458245 为了提高H264的保存效率,抛弃了FFmpeg库的avi封装,直接才 ...
- NFS网络文件系统服务配置、验证及错误解决
NFS网络文件系统服务配置.验证及错误解决 前期准备: 1.至少准备一台服务器(nfs-server)和一台客户机(nfs-client).老表测试用的服务器端用的系统是ubuntu,客户机用的是Ce ...
- 怎么把avi文件转换成mp4视频格式,4个高能方法
怎么把avi文件转换成mp4视频格式? 当您下载到avi格式的视频文件时,您可能会选择将其转换为MP4格式的文件. avi是一种由微软开发的多媒体容器格式,尽管现在已经被认为是老旧的技术,但由于其简单 ...
- AVI文件数据流操作
Video for Windows (VFW)在16位Windows中就引入了,现在的很多功能被DirectX所代替或超越了.但是还是有一些用处的. Audio-video-interleaved f ...
最新文章
- java宝典app_java宝典安卓版_手机java宝典V2.0下载(暂未上线)_预约_飞翔下载
- 若依的框架怎么样_基于bootstrapTable的若依框架如何获取表格选中行的整行数据?...
- Week1 Team Homework #2 Introduction of team member with photos
- 明明的随机数(快排)
- 【转载】一次项目管理交流会总结
- SAP License:什么是SAP ECC?与WMS系统集成技术要点
- 切片 go 去除第一个_golang学习笔记--切片slice 与数组 arr
- NYOJ845 - 无主之地1
- net.sf.json Sring转JSON对象 数据精度丢失
- postgres 显示变量,如何在PostgreSQL查询中声明变量
- java batik_java – 如何在Batik SVG库中使用自定义字体?
- 科大学长对数学系学弟学妹的忠告
- RFID通信系统框图
- 在数据可视化这条路上,除了天天做图表,还有更重要的3件事
- linux删除卸载npm,卸载安装node npm (Mac linux )
- 公众号网课查题-掘光者题库系统
- uni-app修改代码,微信开发者工具不更新
- mysql的reorg_DB2 runstats和reorg操作
- 给你一本武林秘籍,和KeeWiDB一起登顶高性能
- flutter在IOS上显示英文
热门文章
- 新闻推荐系统:深度知识感知网络DKN
- 集合框架学习笔记:Collection体系和Map体系、Collections工具类
- webERP安装配置超详细
- 移动端前端的适配和rem,vm其他的一些的复习
- 百度网盘网页倍速播放视频的小技巧
- linux kernel decompress_kernel 启动解压
- MT4-EA自动化交易研究笔记(2022-06-24)
- mongo执行逻辑表达式_Mongo学习记录
- 求解非线性方程组的牛顿法c语言,牛顿下山法求解非线性方程(组)(C实现)...
- 2019 原创技术干货整理