AVI媒体封装格式

来源:互联网 发布:免费服装销售软件 编辑:程序博客网 时间:2024/05/24 05:35

AVI文件采用标准的RIFF格式进行封装,在分析AVI文件格式之前我们先简单介绍RIFF格式。

1. RIFF格式简介

资源文件交换格式,Resource Interchange FileFormat(简称RIFF)。是一种按照标记区块存储数据(tagged chunks)的的通用文件存储格式,多用于存储音视频等多媒体数据。Microsoft在Windows下的AVI、ANI、WAV等都是基于RIFF格式的文件封装。

2. RIFF文件结构

RIFF文件结构是标准的树形结构,RIFF结构中包含两种节点:
(1) Leaf节点,该节点为叶子节点,不能包含子节点。
(2) Container节点,该节点可以包含Leaf节点。
Leaf节点的数据结构为:

typedef struct {DWORD ID;           // 4字节,4个可打印ASCII字符,标识类型DWORD Size;         // 4字节,数据块长度BYTE  Data[Size];   // 数据块}Leaf

Container节点的数据结构为:

typedef struct {DWORD ID;           // 4字节,4个可打印ASCII字符,标识类型DWORD Size;         // 4字节,数据块长度DWORD FormatType;   // 4字节,4个可打印ASCII字符,标识子类型                    // ID为“RIFF”时称为 FormatType                    // ID为“LIST”时称为 ListTypeBYTE  Data[Size];   // 数据块}Container

下图展示的示例RIFF文件包含了:
1个类型为“RIFF”的Container节点;
1个类型为“LIST” 的Container节点;
2个Leaf;
其中“RIFF”包含“LIST”,“LIST”包含2个Leaf节点。
这里写图片描述

3. AVI文件格式分析

AVI文件采用标准的RIFF格式,其结构是以类型为“RIFF”的节点为根节点的树状结构。
在AVI文件结构中类型为“RIFF”和“LIST”的节点是Container节点,一个AVI文件中只允许存在一个类型为“RIFF”的节点,类型为“LIST”的Container节点和Leaf节点没有限制。
一个典型的AVI文件结构如下图所示:
这里写图片描述
这里写图片描述
ListType为“movi”的Container的数据区域中保存的是音视频帧(audio sample、video sample)编码数据。
“movi”中的音视频帧封装在数据区中的Leaf节点中,“00dc”代表视频帧,“01wb”代表音频帧。
ID为“idx1”的Leaf的数据区中保存的是“movi”中音视频帧的索引,以数组方式排列,索引的结构为:

typedef struct {DWORD ID;           // 4字节,4个可打印ASCII字符,标识帧类型                    // “00dc”代表视频帧,“01wb”代表音频帧DWORD flags;        // 4字节,标志位,0x00000010代表关键帧DWORD offset;       // 4字节,“movi”节点的数据区中保存的帧节点相对于//“movi”节点ListType位置的偏移,也就是“movi”这// 个ListType的偏移(AVIMasterGUI中ChunkOffset)。DWORD len;          // 4字节,当前帧的长度,等于包含当前帧的Leaf节点的                    // 的数据块长度。(AVIMasterGUI中的ChunkLength)}SapleIndex

下面举例如何计算帧n在文件中的绝对位置和长度:

Container *movi     =  (“movi”节点在文件中的偏移) + 8    //+8跳过ID和SizeSampleIndex *index  =  (“idx1”节点在文件中的偏移) + 8    //+8跳过ID和Size帧n位置            =  index[n]->offset + movi + 8          //+8跳过ID和Size帧n长度            =  index[n]->len
原创粉丝点击