视频文件格式解析之 3GP/MP4
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等
from: http://hi.baidu.com/bamboolsu/blog/item/df14f0eef1f2c51dfcfa3cac.html
视频文件格式解析之 3GP/MP4相关推荐
- 视频文件格式解析之 3GP/MP4 .
1. 概述 流行的文件格式背后都有大公司的支持.FLV得益于ADOBE公司推动的网络视频分享风潮,而AVI则是MICROSOFT首创的RIFF即视频和音频交 织在一起同步播放. 3GP/MP4是APP ...
- 阿甘的巧克力盒子: 手机视频文件格式解析之 3GP/MP4
作者: k歌之王 2009-08-23 前言:做完了手机全能播放器的项目, 又要告别几个月来并肩作战,即将去北京发展的Manager zhu.准备把 做过的3GP/FLV/AVI格式整理一遍, ...
- 手机视频文件格式解析之 3GP/MP4
转载自百度文库 作者: k歌之王 2009-08-23 前言:做完了手机全能播放器的项目, 又要告别几个月来并肩作战,即将去北京发展的Manager zhu.准备把 做过的3GP/FLV/A ...
- 视频文件格式解析之 3GP与MP4
1. 概述 流行的文件格式背后都有大公司的支持.FLV得益于ADOBE公司推动的网络视频分享风潮,而AVI则是MICROSOFT首创的RIFF即视频和音频交 织在一起同步播放. 3GP/MP4是APP ...
- 3GP/MP4 视频文件格式解析及其播放原理(转)
视频文件格式解析之 3GP/MP4 1. 概述 流行的文件格式背后都有大公司的支持.FLV得益于ADOBE公司推动的网络视频分享风潮,而AVI则是MICROSOFT首创的RIFF即视频和音频交 织在一 ...
- android 播放视频文件格式,Android视频文件格式解析相关分析
目录结构 OpenCore的代码在如下目录中:external/opencore/.这个目录是OpenCore的根目录,其中包含的子目录以下所示: * android:这里面是一个上层的库,它基于PV ...
- 【音视频】MP4文件格式解析
MP4文件格式解析 一.目的 二.MP4结构一览 2.2 MP4结构参考图 2.2 MP4结构参考表 三. MP4格式解析 & 实例分析 3.1 box 3.2 ftyp (File Type ...
- mp4文件格式解析(一)
原文地址:mp4文件格式解析(一)作者:可下人间 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准.随后MP4概念被转移到视频上,对应的是MPE ...
- 第七季1:MP4文件格式解析
以下内容源于朱有鹏课程,如有侵权,请告知删除. 本季内容 (1)将编解码得到的视频打包成mp4格式并存储到TF卡 MP4的组织形式和box解析 移植和使用mp4v2开源库来打包MP4 进一步研究MP4 ...
最新文章
- ACCP学习旅程之-----使用C#开发数据库应用程序(第二章)
- opencv4 python 版本_Opencv4 with Python3.6
- python数据类型描述_【文山玩Python】用python的数据类型,来简单的描述世界
- python中MySQLdb模块用法实例
- db2 快速清除表中所以的数据
- 潭州课堂25班:Ph201805201 爬虫高级 第十二 课 Scrapy-redis分布 项目实战 (课堂笔记)...
- 网址大全:国外超级便宜空间
- js控制css 加载,CSS样式表的加载对于DOM解析,渲染,JS执行的阻塞问题
- pytorch tensor_Pytorch之Tensor操作
- boost::algorithm学习
- php商店管理系统,基于PHP的商店管理系统.doc
- hadoop 查看集群的网页监控状态
- 二调建设用地地类代码_二调地类代码表[1]
- JavaScript实现HTML导航栏下拉菜单[悬浮显示]
- php 多元数组,php数组_php多元数组
- 标准差(Standard Deviation) ,标准误差(Standard Error)及置信区间(CI)通俗解释
- Android性能优化系列-监听View inflate周期并动态替换
- nRF53832开发环境搭建
- 高版本IE浏览器(IE8、IE9)查看网页Applet问题解决方案
- Poi解析对比excel表格
热门文章
- Hello World @ Cloud Foundry
- 软考 | 2016年下半年 软件设计师 下午试卷
- 谈谈使用苹果键盘(Magic Keyboard)和鼠标(Magic Mouse 2)的感受
- Day2-转自金角大王
- deepin系统下载速度非常慢解决方法
- 蜗牛学院:《王者荣耀》的浪潮正渐平静,“吃鸡”战场的枪声,则悄然打响...
- kaggle平台的使用
- IOS网络第一天 - 02SDWebImage
- 三服务 | 浙江省委信息化管理中心领导参观走访世平信息
- 小程序不引入基础组件实现weui使用(附加小程序换行显示)