赵云为什么不投曹操:手机视频文件格式解析之 3GP/MP4 - 和和她爸的日志 - 网易博客

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 18:35:47

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

移动流媒体 2009-10-24 10:22:12 阅读821 评论0   字号: 订阅

1. 概述

  流行的文件格式背后都有大公司的支持。FLV得益于ADOBE公司推动的网络视频分享风潮,而AVI则是MICROSOFT首创的RIFF即视频和音频交织在一起同步播放。 3GP/MP4是APPLE提出并得到ISO标准支持作为NOKIA等手机的默认视频格式。3GP是MP4格式在手机上的简化版。MP4的codec组合一般是mpeg4 + AAC, 3GP则按版本演进分为3gpp r5(h.263/mpeg4 + AMR-NB/AMR WB), 3gpp r6(增加h.264视频和aacPlus音频支持)。

  有人会把MP4和MPEG4搞混, 前者是文件容器(container),后者是视频编码格式, 容器的作用是把压缩编码

后的视频和音频数据尽可能紧凑的排布,就好像阿甘的巧克力盒子,你并不知道盒子里有什么, 但你可以按照

既定的线索解开文件,取出你需要的数据。

文件格式一般包括以下三要素:

 header: 标记文件类型,音视频码流的基本属性信息
 index:    索引表,每个frame有对应的offset,size,timestamp.
 stream: 真正的音视频流数据。
 任何文件格式都应该有以上3要素。 当然AVI视频没有索引也能播放,但不能拖放seek,需要自己重建索引。解

析器(demuxer)根据frame_id找到其在文件中的offset和size,然后读取出来解码并播放。

2. 文件格式分析

 下面来分析一下3GP/MP4文件格式。APPLE的格式有2个特点,1. 排布紧凑几乎没有冗余数据(AVI则有很多junk

数据),2.音视频码流数据可随意存放而不需按时间顺序排布。

  3gp文件由一系列的box(atom)组成。每个box的结构都是4字节的size,4字节的type, 还有一些data数据。用

mp4info查看3gp文件的数据排布如下图:

 

  如上图, ftyp是表示文件的版本信息, mdat存放文字,音视频等数据。你可能要问,这些音视频数据怎么找

到呢? 是通过moov box里的子box trak,里面存放着音视频的属性描述以及每个sample的索引。

3. 关于sample atoms

   video和audio的码流属性(如视频width/height,codec id, 音频采样率声道数等)存放在stsd box里; 下面

着重介绍MP4高效压缩的精华:stts,stss,stsc,stsz,stco五个box。对比AVI的索引表是每个sample都有对应的

id,flag,offset,size,3GP的高效索引方式可以把AVI转码成同码率的MP4后,文件size减小成原来的20-30%!

1. stts atom(time to sample atoms,见quicktime format 文档图2-28  标准文档点击下载): 存储了sample

的时间信息。stts能让很方便的根据timestamp找到对应的sample,或者获取某个sample对应的timestamp. stts

 table记录着有相同duration的sample的数量count和时长dutation。

2. stss atom(sync sample atom,见文档图2-31): 存储了每个关键帧的sample id。 stss能让你很方便的找到

当前帧最近的关键帧。

3. stsc atom(sample to chunk atom): sample存放在chunk里为了允许优化的数据读取。比如音频sample size

都很小(amr-nb sample size为32字节), 每次读取一个sample开销太大, 可一次性读所在chunk里一堆

sample。

4. stsz atom(sample size atom): stsz可以描述每个sample的size.

5. stco atom(chunk offset atoms): stco描述了每个chunk在文件中的绝对偏移位置。该offset可以是32位的

也可以是64位的,后者用来支持处理超大文件。

4 .使用sample atoms来处理播放流程

  • 查找sample        

1.确定时间,相对于媒体时间坐标系统

2.检查time-to-sample atom来确定给定时间的sample序号。

3.检查sample-to-chunk atom来发现对应该sample的chunk。

4.从chunk offset atom中提取该trunk的偏移量。

5.利用sample size atom找到sample在trunk内的偏移量和sample的大小。

例如,如果要找第1秒的视频数据,过程如下:

1.  第1秒的视频数据相对于此电影的时间为600

2.  检查time-to-sample atom,得出每个sample的duration是40,从而得出需要寻找第600/40 = 15 + 1 = 16个sample

3.  检查sample-to-chunk atom,得到该sample属于第5个chunk的第一个sample,该chunk共有4个sample

4.  检查chunk offset atom找到第5个trunk的偏移量是20472

5.  由于第16个sample是第5个trunk的第一个sample,所以不用检查sample size atom,trunk的偏移量即是该sample的偏移量20472。如果是这个trunk的第二个sample,则从sample size atom中找到该trunk的前一个sample的大小,然后加上偏移量即可得到实际位置。

6.  得到位置后,即可取出相应数据进行解码,播放

  •       查找关键帧     

查找过程与查找sample的过程非常类似,只是需要利用sync sample atom来确定key frame的sample序号

确定给定时间的sample序号
检查sync sample atom来发现这个sample序号之后的key frame
检查sample-to-chunk atom来发现对应该sample的chunk
从chunk offset atom中提取该trunk的偏移量
利用sample size atom找到sample在trunk内的偏移量和sample的大小


5 .3GP/MP4相关资源

     quicktime file format specification: 最权威的格式文档 点击下载
     开源的3GP/MP4解析器: ffmpeg, GPAC, helix, google opencore等
手机视频文件格式解析之 3GP/MP4 - 和和她爸的日志 - 网易博客 MP4文件格式解析(转载) - eastnapoleon的日志 - 网易博客 mp4转换器大全-免费下载mp4格式转换器,amv转换器,3gp转换器,avi转换器,... gridview截取字符长度和日期显示格式 - 公子的日志 - 网易博客 刘晓庆和她的八个情人 - 桃花盛开的日志 - 网易博客 教你免费玩收费的手机彩铃和游戏 - 至死不渝的日志 - 网易博客 教你下载手机铃声和游戏的技巧 - 理睬的日志 - 网易博客 关注中医的阳光和空气 - 任之堂主人的日志 - 网易博客 博客代码和素材大全 - ajun2008的日志 - 网易博客. 博客代码和素材大全 - ajun2008的日志 - 网易博客 药店管理制度之《特殊药品和贵细药品管理制度》啊 - yl77728的日志 - 网易博客 理财规划步骤和核心 - 管理之家的日志 - 网易博客 药店管理制度之《特殊药品和贵细药品管理制度》 - yl77728的日志 - 网易博客 Ethernet的帧格式 (转) - JOE的日志 - 网易博客 常见音频文件格式 - 章鹏律师的日志 - 网易博客 格式合同范本 - 浪八圈的日志 - 网易博客 中国“家谱格式” - 坡上居主的日志 - 网易博客 归纳法和演绎法的原型 - 安重纪的日志 - 网易博客 久咳和口腔溃疡偏方 - pldlxn的日志 - 网易博客 富翁和狼 - Charlie的日志 - 网易博客 记忆人名和面孔 - 然的日志 - 网易博客 人生“二”和“三” - 真光的日志 - 网易博客 音画和常用代码 - 计英的日志 - 网易博客 好好和自己恋爱一场 - 蔷薇的日志 - 网易博客