3gp文件格式研究

来源:互联网 发布:振华重工 知乎 编辑:程序博客网 时间:2024/05/17 01:45

序言

06我开始做3gp文件的播放器,但是关于3gp的文档太少了也很难找,在网友luxh的帮助下,
我终于有了第一份关于3gp文件格式的文档《ISO/IEC 14496-12,ISO媒体文件格式》.
在此真心感谢luxh的贡献.
当然了是英文版的,有文档就不错了.为了便于查阅和理解,我把之后陆续找到的其他几个文档也揉在了一起.
从06年5月12日到现在2007-3-23,一点点的挤时间,总算写完了.如有错误,敬请斧正.
之所以写这篇文章目的只有一个,希望大家都能够少走弯路.
有用的到的人可以随意复制,转贴.
因为以后我有可能会对本文修改更新,所以请保留文中的原始链接.
愿意同我一道研究的人请加msn:windcao@hotmail.com

需要看的文档
http://www.3gpp.org/ftp/Specs/archive/26_series/
3GPP TS 26.233
3GPP TS 26.243
3GPP TS 26.244


luxh找到的一个好东西
http://isotc.iso.org/livelink/livelink/fetch/2000/2489/Ittf_Home/PubliclyAvailableStandards.htm
大家一定要仔细找找啊,宝藏!
我们研究3gpp文件最重要的两个文档就是《ISO/IEC 14496-12,ISO媒体文件格式》和《3GPP TS 26.244-700》


ISO/IEC 14496的组成如下:(引自:http://www.blogcn.com/user73/lipingfu/index.html)
(1)ISO/IEC 14496-1,系统部分,描述了组成一个场景的音频和视频成分之间的关系。
(2、3)ISO/IEC 14496-2,视频部分和ISO/IEC 14496-3音频部分,分别规定自然的和合成的视频对象、音频对象的编码表示。
(4)ISO/IEC 14496-4,一致性测试部分,定义了比特流和设备的一致性条件,用来测试MPEG-4的实现。
(5)ISO/IEC 14496-5,参考软件,包括与MPEG-4的主要部分相对应的软件。
(6)ISO/IEC 14496-6,多媒体传送整体框架DMIF,这是MPEG-4应用层与传输网络的接口,定义了通信协议,使MPEG-4系统的数据流能进入各种传输网络。还包含一个存储格式MP4,用于存储编码的场景。
(7) ISO/IEC 14496-7,为MPEG-4工具优化软件,提供了对实现进行优化的例子(这里的实现指的是第五部分)。
(8)ISO/IEC 14496-8,定义了在IP网络上传输MPEG-4内容的方式。
(9)ISO/IEC 14496-9,为参考硬件描述,提供了用于演示怎样在硬件上实现本标准其他部分功能的硬件设计方案。
(10)ISO/IEC 14496-10,高级视频编码AVC,定义了一个被称为AVC的视频编解码器。
(11)ISO/IEC 14496-11,场景描述和应用引擎。
(12)ISO/IEC 14496-12,ISO媒体文件格式,定义了一个存储媒体内容的文件格式。
(13)ISO/IEC 14496-13,知识产权管理和保护(IPMP)扩展。
(14)ISO/IEC 14496-14,MP4文件格式,定义了基于第十二部分的用于存储MPEG-4内容的容器文件格式。
(15)ISO/IEC 14496-15,AVC文件格式,定义了基于第十二部分的用于存储第十部分的视频内容的文件格式。
(16)ISO/IEC 14496-16,动画框架扩展AFX(Animation Framework eXtension)。
(17)ISO/IEC 14496-17,同步文本字幕格式(尚未完成,2005年1月达成"最终委员会草案"。
(18)ISO/IEC 14496-18,字体压缩和流式传输(针对公开字体格式)。
(19)ISO/IEC 14496-19,综合材质流(Synthesized Texture Stream)。
(20)ISO/IEC 14496-20,简单场景表示(尚未完成,2005年1月达成"最终委员会草案"。
(21)ISO/IEC 14496-21,用于描绘(Rendering)的MPEG-J拓展(尚未完成,2005年1月达成"委员会草案"

我做的一个辅助工具:http://download.csdn.net/source/162821 3gpp文件结构查看器
目前最新版本是0.1.3

这个工具的源码:http://download.csdn.net/source/162682

正文:
首先来说3gp文件相当于一个容器,本身没有什么具体的编码解码规则。
我们可以选择编码方式 
- AMR narrow-band:编码简称'samr' 常用与语言片段的压缩,可以对声音片段进行最大程度的压缩,但是失真较大,如果用在音乐文件上结构常常是无法忍受的。

(详情请参考:3GPP TS 26.071: "Mandatory Speech CODEC speech processing functions; AMR Speech CODEC; General description".)

- AMR wideband:编码简称'sawb' 相对AMR narrow-band来说压缩比降低了,品质有所提升可用来压缩音乐。

(详情请参考:3GPP TS 26.171: "AMR Wideband Speech Codec; General Description".)

- Extended AMR-WB codec编码简称 'sawp'

(详情请参考:
3GPP TS 26.290: "Extended AMR Wideband codec; Transcoding functions".
3GPP TS 26.304: "ANSI-C code for the Floating-point; Extended AMR Wideband codec".
3GPP TS 26.273: "ANSI-C code for the Fixed-point; Extended AMR Wideband codec".

- Enhanced aacPlus and MPEG-4 AAC codec编码简称 'mp4a'

(详情请参考:
3GPP TS 26.401: "General audio codec audio processing functions; Enhanced aacPlus general audio codec; General description".
3GPP TS 26.410: "General audio codec audio processing functions; Enhanced aacPlus general audio codec; Floating-point ANSI-C code".
3GPP TS 26.411: "General audio codec audio processing functions; Enhanced aacPlus general audio codec; Fixed-point ANSI-C code".

- MPEG-4 video codec编码简称'mp4v'

(详情请参考:ISO/IEC 14496-2:2004: "Information technology – Coding of audio-visual objects – Part 2: Visual".)

- H.263 video codec编码简称'h263'

(详情请参考:ITU-T Recommendation H.263 (01/05): "Video coding for low bit rate communication".)

- H.264 video codec编码简称'avc1'

(详情请参考:ITU-T Recommendation H.264 (03/05): "Advanced video coding for generic audiovisual services"
ISO/IEC 14496-10:2005: "Information technology – Coding of audio-visual objects – Part 10: Advanced Video Coding".)

- 3GPP timed text format 编码简称'tx3g'

(详情请参考:3GPP TS 26.245: "Transparent end-to-end packet switched streaming service (PSS); Timed text format".)

其中手机最普遍支持的格式是 amr(音频) +h263(视频)

 3gp文件基于mpeg4由若干个box组成

 一个3gp文件由若干个box组成常见的有:


文件类型包:(FileTypeBox,简称代码'ftyp')
ftyp:文件类型包相当于文件头,说明了文件所使用的协议版本,编码格式等信息
+[4]-+[4]-+[4]-+[4]-+[4]-+
|size|ftyp|mjbr|mivs|cpbr|
+----+----+----+----+----+
mjbr:major_brand 版本分支
mivs:minor_version 版本号 
cpbr:compatible_brands 兼容分支

媒体数据包:(Media Data Box,简称代码'mdat')
"Media Data Box 
Box类型: ‘mdat’ 
容器: 文件 
是否必须: 否 
数量: 任意个. "-luxh

3gp file frame
mdat box 存放了音频视频和其他的数据,一般的文件至少有2个mdatbox, 一个用于音频,一个用于视频, 通常还会有一些文本信息也放在mdatbox中,各种信息的顺序不固定。 如果只是存放音乐一个mdat就够用了。

你可能会问这么多box 都叫mdat我怎么知道音频放哪里视频放哪里呢?别着急这些相关信息都放在moovbox里面

影片包:(moov box:Movie Box:)是一个3gp文件中最复杂最重要的文件。
 

看到这里你可能会问"moovbox里面的方框都分别代表什么含义呀?媒体描述信息是怎么存放的?",别着急咱们来慢慢分析一下。
"Movie Box 
Box类型: 'moov'; 
容器: 文件 
是否必须: 是 
数量: 一个,并且只能是一个.

媒体的原始数据被放置在这个box中,这个box位于文件的最高级别,一般来说这个box接近于文件的开始或者末尾,尽管这并不被要求。语法如下: 
a ligned(8) class MovieBox extends Box(‘moov’) {} "-luxh

moovbox 有两个必要的子box他们是影片头包和轨迹包
影片头包movie header,简称代码'mvhd' 
首先剖析一下影片头包,顺便以此为例理解一下包的结构。
每一个包开头的4个字节都是一个整数存放了本包的长度。
接下来的4个字节是个字符串存放了本包的类型。如'moov','mvhd'。
基本上包都是这模样的:
+[4]-+[4]-+[size-8]-------------------+
|size|type|data                       |
+----+----+---------------------------+

很多box是这样的我们可以称之为全包(full box)(这里有块石头,大家小心了,不要把全包当成普通包来读,由于我提醒的不及时,网友陈秋松又在这里摔了一跤,抱歉)
+[4]-+[4]-+-+---+[size-8]-------------------+
|size|type|v|flg|data                       |
+----+----+-+---+---------------------------+

简记为
+[4]-+[4]-+[4]-+[size-8]-------------------+
|size|type|vsfl|data                       |
+----+----+----+---------------------------+

其中vsfl:版本号标志

+-+---+
|v|flg|
+-+---+
v :version
flg:flages

在影片头包中接下来的是版本标志等信息。
MVHD 是媒体信息头,存放媒体的全局性的信息。
+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+[76]----...---------+[4]-+
|size|mvhd|vsfl|cttm|mdtm|tmsc|mxtl|reserved...         |ntid|
+----+----+----+----+----+----+----+--------...---------+----+
size:box长度
type:文件类型标识内容为"mvhd"
vsfl:版本号标志
cttm:creat time 文件创建时间
mdtm:modification time  文件修改时间
tmsc:timescale 时间缩放因数
mxtl:maxTrackLen duration of longest track 最长播放时间
reserved: 保留字段
ntid-next trak id  下一个频道标识

轨迹包TRAK 也是一个容器,是单个媒体流频道的信息的容器,它有两个必要的子box:TKHD,MDIA。
TKHD 存放本trak的信息,有两个版本
v=0
+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+
|size|tkhd|vsfl|cttm|mdtm|tkid|resv|duat|
+----+----+----+----+----+----+----+----+
+[12]--------+2-+2-+[36]----...-+[4]-+[4]-+
|reserved    |ct|rs|reserved    |twvo|thvo|
+------------+--+--+--------...-+----+----+
v=1
+[4]-+[4]-+[4]-+[8]-----+[8]-----+[4]-+[4]-+[8]-----+
|size|tkhd|vsfl|cttm    |mdtm    |tkid|resv|duat    |
+----+----+----+--------+--------+----+----+--------+
+[12]--------+2-+2-+[36]----...-+[4]-+[4]-+
|reserved    |ct|rs|reserved    |twvo|thvo|
+------------+--+--+--------...-+----+----+

size:box长度
type:文件类型标识内容为"tkhd"
vsfl:版本号标志
cttm:creat time 文件创建时间
mdtm:modification time  文件修改时间
tkid:track-id 同一个文件中这是一个不重复的序列
resv:reserved 保留字段
duat:duration 总的播放时间长度
reserved: 保留字段
ct:codec_type {audio=0x0100; video=0} 编码类型,到底是音频还是视频等
rs:reserved 保留字段
reserved: 保留字段
如果这个track 是视频编码它将有如下字段,在你解码的时候非常有用.
twvo:Track width , for visual _disibledevent="http://blog.csdn.net/windcao/archive/2006/05/12/725722.aspx">http://blog.csdn.net/windcao/archive/2006/05/12/725722.aspx

最后更新日期2007-3-23 11:13

 

出处:http://blog.csdn.net/windcao/archive/2006/05/12/725722.aspx

0 0
原创粉丝点击