admin管理员组

文章数量:1531794

2024年4月23日发(作者:)

经常有些童鞋问我类似下面的问题。

A问我说:“我的MP4分明写着能播放AVI吗为什么这一个AVI文件就播放不了”

B问:“我的MP4支持Mpeg-4啊,为什么Mp4文件不能播放呢”

好的,下面我从最基本的概念给大家解释一下,顺便回答这两个问题

首先大家要清楚两个概念,视频文件格式和视频编码方式。

视频文件格式一般情况下从视频文件的后缀名就能看出来,比如AVI,Mp4,3gp,mov,

rmvb等等。这些格式又叫做容器格式(container format),顾名思义就是用来装东西的,

你可以把它想象成为一个便当盒,或者野餐篮(兄弟,你没吃早饭吧)。

通常我们从网上下载的电影都是有声音的(废话,难道你只看默片!众人扔香蕉皮),

所以容器格式中一般至少包含有两个数据流(stream),一个视频流,一个音频流,就好比

是一个便当盒里装着的配菜和米饭。

视频编码方式则是指容器格式中视频流数据的压缩编码方式,例如Mpeg-4,,,等等。

而视频数据采用了何种编码方式是无法单单从文件格式的后缀上看出来的。就是说你无法从

一个盖着盖子的便当盒外面看出里面装了什么配菜。

如果你想播放一个视频文件,第一步你的播放器(不论是软件的还是硬件的)要能够解

析相应的容器格式,这一步也叫做解复用(demux),第二步你的播放器要能够解码其中所

包含视频流和音频流。这样影片才能播放出来。

打个不太恰当的比方,播放器好比你雇用的一个试菜员,由他来品尝便当(视频文件),

然后告诉你便当里装了什么东西。(没天理阿!我想自己吃,好的当然可以,0x00 00 01 B6

05 FF 36 1A 50 …… ……, 俄~)

所以试菜员首先要懂得如何打开便当盒,还要知道吃的出来便当盒里装了什么配菜,这

样你才能获得你想要的信息。

回过头来看前面的两个问题,用以上的比喻翻译一下。

问题A,我的试菜员能打开AVI这种便当的,为什么我不能知道里面装了什么

回答很简单,虽然他能够打开便当,但是吃不出里面的东西是什么。理论上没有一个播

放器能够播放所有的AVI格式的电影,因为你不知道我会往里面放什么配菜。

问题B,我的试菜员吃过Mpeg-4这种牛排阿,为什么不能打开Mp4这种便当盒呢

这个问题通过翻译之后看起来已经不是问题了,Mpeg-4是视频编码方式,而Mp4是容

器格式,两者本来就不是一个范畴里的东西。

好了下面简单介绍一下流行的视频格式。

AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公

司开发的一种数字音频与视频文件格式,允许视频和音频交错在一起同步播放。

AVI文件的格式是公开并且免费的,大量的视频爱好者在使用这种文件格式。很多PMP

唯一能支持的格式就是AVI格式,一般的PMP都带有可以转换其他格式视频成为AVI格式的

软件。

AVI文件采用的是RIFF(Resource Interchange File Format,资源互换文件格式)文

件结构,RIFF是Microsoft公司定义的一种用于管理windows环境中多媒体数据的文件格

式。AVI格式包括2种:AVI 和Open-DML AVI。AVI 为传统的AVI格式,Open-DML AVI是

AVI 的扩展。

ASF(Advanced Systems Format)是一个开放格式,它能依靠多种协议在多种网络环境下

支持数据的传送。ASF是专为在IP网上传送有同步关系的多媒体数据而设计的文件格式,

所以ASF格式的信息特别适合在IP网上传输。ASF支持任意的压缩/解压缩编码方式的流媒

体,并可以使用任何一种底层网络传输协议,具有很大的灵活性。目前网上以wmv为后缀的

文件绝大多数采用的是ASF格式,WMV是微软公司视频编码方式而不是文件格式。

,3gp,mov

MP4格式是ISO-IEC Mpeg-4协议Part 14中定义的容器格式。MP4格式实际上是对Apple

公司开发的MOV格式(也称Quicktime格式)的一种改进,两种格式差别很小。

MOV格式广泛应用于Mac OS操作系统,在Windows操作系统上也可兼容,但是远比

不上AVI格式流行。

而应用于3G手机上的音视频文件格式——3GP其实是MP4格式的一种简化版本,3GP

格式是一种由3GPP组织制定的多媒体容器格式(container format),3GPP组织形成的通讯

协议是目前全世界手机厂商使用最广的,而3GP格式当然也是手机视频格式的绝对主流。

MP4,MOV,3GP格式可以说具有相同的文件结构。

另外还有flv,mkv,mpg等等许多其他格式。

介绍完了格式之后,我再给大家说明一下解复用的问题。前面讲到了容器格式中包含

视频和音频数据,怎样将这些数据分离,并送到相应的解码器,而且还要保证音视频的同步

性,这是下面要讨论的话题。

各种格式的解服用并不相同。首先介绍AVI格式。

(一)AVI格式的结构和解复用

AVI文件采用的是RIFF(Resource Interchange File Format,资源互换文件格式)文

件结构,RIFF是Microsoft公司定义的一种用于管理windows环境中多媒体数据的文件格

式。AVI格式包括2种:AVI 和Open-DML AVI。AVI 为传统的AVI格式,Open-DML AVI是

AVI 的扩展。

构造AVI文件的基本单元有2种:列表(LIST)和数据块(Chunk),其基本结构如图

所示。数据块的前4个字节为数据块的ID,接着的4个字节表示数据块的长度。列表的前4

个字节为“RIFF”或者“LIST”。列表可以嵌套子列表和数据块。需要注意的是所给出的数

据块和列表的长度是不包含其前8个字节的。

AVI格式的文件结构见图。对于AVI 格式,整个文件由一个开头4字节为RIFF,ID为

AVI的列表(简称RIFF AVI列表)组成。对于Open-DML AVI格式,若尺寸不超过1G,则文

件只包含一个RIFF AVI列表;若尺寸超过1G,则包含一个RIFF AVI列表和几个RIFF AVIX

列表。Open-DML AVI所独有的数据块和列表在图中作了标注。

RIFF-AVI列表包含3个子列表和一个数据块,其ID分别为hdrl,INFO,movi和idx1,

其中INFO列表和ID为idx1数据块是可选的。而 RIFF AVIX只包含一个movi列表以存储

数据,头信息全都存储在RIFF AVI中。

下面对RIFF-AVI列表的几个组成部分作详细介绍。(本文档中有关AVI格式的结构体

定义见,想要源代码的留下邮箱)

(1)hdrl列表

hdrl列表包含一个ID为avih的数据块,一个ID为odml的列表(仅Open-DML AVI格

式具备)及几个ID为strl的列表。strl列表的个数和文件中所包含流(stream)的个数

相等。

avih数据块的包含最大数据率、总帧数、每帧图像的显示时间等数据格式信息。其具

体格式见结构体AVIMAINHEADER。

strl列表至少包含一个ID为strh的数据块和一个ID为strf的数据块,而ID为strd

的数据块(保存编解码器需要的一些配置信息,没有固定结构)和ID为strn的数据块(保

存流的名字)是可选的。

strh数据块包含数据流类型、流的编解码方式和每秒采样数等有关流媒体的信息。其

格式见结构体AVISTREAMHEADER。

strf数据块紧跟在strh数据块之后,其结构视流媒体类型而定,如果 strh块对应的

是视频数据流,则 strf的格式可见结构体VIDEOSTREAMHEADER。如果 strh块对应的是音

频数据流,则strf的格式可见结构体AUDIOSTREAMHEADER。

odml列表中包含文件总帧数等信息,具体格式见结构体AVIEXTHEADER。

indx数据块包含文件的索引数据,用于播放过程中进度条的拖动。其结构可能为结构

体AVISUPERINDEX, AVIFIELDINDEX,AVISTDINDEX三者中的一种。

值得注意的是avih数据块中提供的总帧数为所在的RIFF AVI列表包含的数据。而odml

列表给出的总帧数则是所有的RIFF AVI列表和RIFF AVIX列表包含数据帧数之和。若文件

不含RIFF AVIX列表,则两个值相等。

(2)movi列表

movi列表可包含音频,视频,字幕或索引数据块。

音频数据块的ID为“##wb”,未压缩的视频数据块的ID为“##db”,经过压缩编码的

视频数据块的ID为“##dc”,字幕数据块的ID为“##tx”,索引数据块(仅Open-DML AVI

格式具备)的ID为ix##或##ix。索引数据块可能为结构体AVIFIELDINDEX或AVISTDINDEX。

(“##”为各个流的通道号,可为“00”,“01”等,例如“00dc”表示视频块,“01wb”

表示音频块)

movi列表有2种结构,第一种如图所示,各种数据块直接存放在列表中。

另一种结构如图所示,movi列表由数个rec列表组成,数据块存放于rec列表中。

(3) idx1数据块

idx1索引数据块位于movi数据块之后,包含定义 movi数据块的索引数据,是可选块,

用于播放过程中进度条的拖动。结构可见结构体AVIINDEX。

前面提到了3种索引数据块的结构:AVISUPERINDEX, AVIFIELDINDEX,和AVISTDINDEX。

其中AVISUPERINDEX指向其他的索引数据块;AVISTDINDEX指向movi列表中存放数据块;

AVIFIELDINDEX指向数据块中的某一场(field)数据。这3种索引块在目前较为少见,一

般的AVI文件都是采用idx1索引块来实现播放过程中进度条的拖动功能的。

本文标签: 格式数据视频列表结构