1.MP4解析工具

mediainfo

mp4box:http://download.tsi.telecom-paristech.fr/gpac/mp4box.js/filereader.html

对于Mp4来说,都是一个个box来去组织元素。比如竖着的box,就是一个个box,这里就是重点关注moov。mp4⽂件由box组成,每个box分为Header和Data。其中Header部分包含了box的类型和⼤⼩,Data包含了⼦box或者数据,box可以嵌套⼦box。MP4⽂件的基本组成单元是box,也就是说MP4⽂件是由各种各样的box组成的,有parent box,还有children box。因此,这些boxes之间存在⼀定的层次关系,总结如下表所示,表中标记出了各个box必选或可选特性,√代表Box必选。

下图是⼀个典型mp4⽂件的基本结构:

Hexinator:

Mp4box和mediainfo对比。

这个trak,就是表示是多少路音频和视频。每一个AVstream都对应一个track。每个track,可能都有宽高信息,编译器信息,采样率,声道,time_base(time_scale)。

表示track width和heigth使用了4个字节。

视频和音频的时间刻度不一样。

音视频的handler也不一样。

比较重要的sample table。

一个MP4文件分为多个track,一个track分为多个chunk,一个chunk有多个sample。mp4数据索引和真正的数据分开区域存储。

先用数据索引找到moov,然后才能找到mdat。

下面的解释就是chunk1-84,都是一一对应1个sample,chunk85,一一对应2个sample,chunk86-88,一一对应一个sample,chunk89,一一对应2个sample,chunk90,一一对应一个sample。

可以根据sample size去读取每一帧数据的大小。

ftyp

File Type Box,⼀般在⽂件的开始位置,描述的⽂件的版本、兼容协议等。

moov

Movie Box,包含本⽂件中所有媒体数据的宏观描述信息以及每路媒体轨道的具体信息。⼀般位于放在⽂件末尾,但如果为了⽀持http边下载边播放则需要将moov提前。注意,当改变moov位置时,内部⼀些值需要重新计算。

mdat

Media Data Box,存放具体的媒体数据。

Moov Insider

mp4的媒体数据信息主要存放在Moov Box中,是我们需要分析的重点。moov的主要组成部分如下:

mvhd

Movie Header Box,记录整个媒体⽂件的描述信息,如创建时间、修改时间、时间度量标尺、可播放时⻓等。

下图示例中,可以获取⽂件信息如时⻓为 Duration: 5016 ms秒。


udta

User Data Box,⾃定义数据。

track

Track Box,记录媒体流信息,⽂件中可以存在⼀个或多个track,它们之间是相互独⽴的。

每个track包含以下⼏个组成部分:

tkhd

Track Header Box,包含关于媒体流的头信息。下图示例中,可以看到流信息如视频流宽度800,⻓度1920。


⾳频的tkhd,则⽐如duration、volume等。

mdia

Media Box,这是⼀个包含track媒体数据信息的container box。⼦box包括:

mdhd:Media Header Box,存放视频流创建时间,⻓度等信息。

hdlr:Handler Reference Box,媒体的播放过程信息。

minf:Media Information Box,解释track媒体数据的handler-specific信息。minf同样是个containerbox,其内部需要关注的内容是stbl,这也是moov中最复杂的部分。stbl包含了媒体流每⼀个sample在⽂件中的offset,pts,duration等信息。想要播放⼀个mp4⽂件,必须根据stbl正确找到每个sample并送给解码器。

mdia展开如下图所示:

mdhd

Media Header Box,存放视频流创建时间,⻓度等信息。视频的mdhd,Time scale,Duration等信息。

⾳频的mdhd,也类似视频,但要注意Time scale,我们在计算时间戳的时候都要使⽤该Time scale,对应我们流⾥⾯的AVStream->time_base

hdlr

Handler Reference Box,媒体的播放过程信息视频的hdlr,重点Component subtype: vide。

⾳频的hdlr,Component subtype: soun,如果我们多个⾳轨的时候,Component name:粤语。

我们分析的⽂件另⼀路⾳轨,根据不同的名字来进行区别。

minf

minf:Media Information Box,解释track媒体数据的handler-specific信息。minf同样是个containerbox,其内部需要关注的内容是stbl,这也是moov中最复杂的部分。stbl包含了媒体流每⼀个sample在⽂件中的offset,pts,duration等信息。想要播放⼀个mp4⽂件,必须根据stbl正确找到每个sample并送给解码器。

⽽且需要注意的是,minf⾥⾯的⼦容器,⾳频和视频轨是有区别的,⽐如视频轨:vmhd, ⾳频轨则为:smhd

vmhd

smhd

Stbl Insider

Sample Table Box,上⽂提到mdia中最主要的部分是**存放⽂件中每个sample信息的stbl。**在解析stbl前,我们需要区分chunk和sample这两个概念。

在mp4⽂件中,sample是⼀个媒体流的基本单元,例如视频流的⼀个sample代表实际的nal数据chunk是数据存储的基本单位,它是⼀系列sample数据的集合,⼀个chunk中可以包含⼀个或多的sample。

stbl⽤来描述每个sample的信息,包含以下⼏个主要的⼦box:

stsd

Sample Description Box,存放解码必须的描述信息。下图示例中,对于h264的视频流,其具体类型为 avc1 ,extensions中其中存放有sps,pps等解码必要信息。

视频的stsd

⾥⾯包含了avc1,avc1⾥⾯⼜包含了avcC和pasp。

avc1:包含了视频Width、Height。

avcC:包含了视频编码器相关的信息,包括sps、pps等信息。

⾳频的stsd

用Hexinator分析,包含了音频相关的信息,比如采样率,通道数。

stts

Time-to-Sample Box,定义每个sample时⻓。Time-To-Sample的table entry布局如下:

stts table entry布局

sample count:sample个数。

sample duration:sample持续时间。

持续时间相同的连续sample可以放到⼀个entry⾥达到节省空间的⽬的。这⾥先给出来的是视频的stts,Number of entries,这个参数需要注意并不是sample的个数,sample的实际数量需要将每个entry的sample count进⾏累加才是真正的sample个数。

下图示例中,第1个sample时间为3720,单位⽤mdhd的time scale进⾏换算,⽐如视频的是90000,此时换算成秒为3720/90000 = 0.0413333333333333秒


再给出个⾳频的stts,只是mdhd的time scale的差别,之前我们看到⾳频为44100,则计算第⼀个sample的时间。1024/44100=0.0232199546485261秒。

stss

Sync Sample Box,同步sample表,存放关键帧列表,关键帧是为了⽀持随机访问。

stss的table entry布局如下:

stss table entry布局

下图示例中,该视频track有3个关键帧:

stsc

Sample-To-Chunk Box,sample-chunk映射表。

上⽂提到mp4通常把sample封装到chunk中,⼀个chunk可能会包含⼀个或者⼏个sample。Sample-To-Chunk Atom的table entry布局如下图所示:

First chunk:使⽤该表项的第⼀个chunk序号

Samples per chunk:使⽤该表项的chunk中包含有⼏个sample

Sample description ID:使⽤该表项的chunk参考的stsd表项序号

下图示例中,可以看到该视频track⼀共有1个stsc表项,chunk序列1-x,每个chunk包含⼀个sample。这⾥则说明每个chunk⾥⾯只有⼀个sample⼀个chunk是可以有多个sample)。

stsz

Sample Size Box,指定了每个sample的size。Sample Size Atom包含两sample总数和⼀张包含了每个sample size的表

sample size 表的entry布局如下图:

下图示例中,该视频流⼀共有110个sample,第1个sample⼤⼩为42072字节,第2个sample⼤⼩为7354个字节。

stco

Chunk Offset Box,指定了每个chunk在⽂件中的位置,这个表是确定每个sample在⽂件中位置的关键。该表包含了chunk个数和⼀个包含每个chunk在⽂件中偏移位置的表。每个表项的内存布局如下:

需要注意,这⾥stco只是指定的每个chunk在⽂件中的偏移位置,并没有给出每个sample在⽂件中的偏移。想要获得每个sample的偏移位置,需要结合 Sample Size box(stsz)和Sample-To-Chunk(stsc) 计算后取得。

下图示例中,该视频流第1个chunk在⽂件中的偏移为4750,⽽这⾥是每个chunk只有⼀个sample,此时第⼀个sample的起始位置就为4750->0x1D78,数据⼤⼩则参照stsz,第⼀个sample size为172818。

⽐如偏移位置,7544->0x1D78。

如何计算sample偏移位置

上⽂提到通过stco并不能直接获取某个sample的偏移位置,下⾯举例说明如何获取某⼀个pts对应的sample在⽂件中的位置。

⼤体需要以下步骤:

(1)将pts转换到媒体对应的时间坐标系。

(2)根据stts((decoding) time-to-sample)计算某个pts对应的sample序号

(3)根据stsc(sample-to-chunk)计算sample序号存放在哪个chunk中

(4)根据stco(chunk offset)获取对应chunk在⽂件中的偏移位置

(5)根据stsz获取sample在chunk内的偏移位置并加上第4步获取的偏移,计算出sample在⽂件中的偏移。

例如,想要获取3.64秒视频sample数据在⽂件中的位置。

(1)根据time scale参数,将3.64秒转换为视频时间轴对应的3640000 (假如时间刻度不为毫秒)。

视频轨:time scale为90000,转成对应的时间戳为3.64秒*90000。

(2)遍历累加下表所示stts所有项⽬,计算得到3640000位于第110个sample = 327600。

(3)计算出多个sample_deltas叠加才到了327600, 我们这⾥姑且按3780作为平均值计算,实际是37201+37801+36901+37802 … 这样⼀直叠加进⾏。327600/3780 =86.66666666666667,取整为86。

(4)查询下表所示stsc所有项⽬,计算得到第86个sample位于第86个chunk,并且在该chunk中位于第1个sample(因为我们的码流是每个chunk对应了⼀个sample)。

(5)查询下表所示stco所有项⽬,得到第86个chunk在⽂件中偏移位置为1004678。使⽤hexinator。

(6)查询下表所示stsz所有项⽬,得到第86个sample的size为20934。计算得到3.64秒视频sample数据在⽂件中。

offset:1004678+0 = 1004678

size:20934。

验证:⽤编辑器打开mp4⽂件,定位到⽂件偏移1004678位置。09分隔符,这⾥占⽤了6个字节, 再看真正的数据区域,前4字节也为 NALU的⻓度0x000051bc=20924。

总共占⽤的字节计算 4+2+4+20924 = 20934。

《整理mp4协议重点,将协议读薄》:

⼀个chunk含有多个sample的情景参考下⾯链接进⾏分析:

mp4⽂件格式重点解析:https://www.jianshu.com/p/44c9567d8fcb

超详细MP4格式分析相关推荐

  1. MP4学习(一)MP4格式分析

    MP4格式分析 mp4文件由一系列的box(也有人把它叫做atom)构成,每个box包含box头部和box体.box体可以包含普通的数据,也可以包含其他的box,如果box中包含了另一个box,这种b ...

  2. MP4格式分析之元数据moov(一)

    movie box -- container box whose sub-boxes define the metadata for a presentation ('moov') moov包含的一系 ...

  3. 超详细 ELK 日志分析系统

    文章目录 一.ELK日志分析系统简介 1:ELK日志分析系统组成 2:日志处理步骤 二:三款软件简介 1:Elasticsearch (1)Elasticsearch的概述 (2)Elasticsea ...

  4. lr背景虚化_【教程】人像后期LR+PS超详细流程+思路分析

    思路分析(附赠预设) ( 这将是一个非常非常非常详细的教程 ...) 总有人会问 : 后期的时候到底该怎么入手啊 ... 这时候你去求助于玄学大师 , 大师会告诉你 : 怎么好看怎么弄 ... 这话没 ...

  5. 超详细BootLoader原理分析

    [摘要]本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― BootLoader 的概念.软件设计的主要任务以及结构框架等内容. 在拿到空PCB板之后,硬件工程师首先会测试各主要线路是否通连 ...

  6. [转载] Python基础——Numpy库超详细介绍+实例分析+附代码

    参考链接: Python中的numpy.identity 1.NumPy简介 NumPy是高性能科学计算和数据分析的基础包,计算速度要比python自带的函数快很多,非常好用.一般不需要安装,装Pyt ...

  7. @property python知乎_知乎某处XSS+刷粉超详细漏洞技术分析

    我觉得十分经典的一个漏洞,和大家分享一下~ 好久没法前端漏洞分析了,这次来一个. 将输入的信息传入URI参数,解码以后赋值与location.href.明显可以利用JavaScript:伪协议执行js ...

  8. AM335x启动流程(BootRom-MLO-Uboot)超详细源码分析

    转载地址:https://blog.csdn.net/p942005405/article/details/83376464 写的非常好,收藏学习 参考文件: 1,AM335x ARM Cortex- ...

  9. mp4格式解析、分割

    2019独角兽企业重金招聘Python工程师标准>>> MP4文件格式的解析,以及MP4文件的分割算法 mp4应该算是一种比较复杂的媒体格式了,起源于QuickTime.以前研究的时 ...

最新文章

  1. 微软职位内部推荐-Software Engineer II-Data Mini
  2. Spring Cloud Alibaba - 17 Nacos Config 配置中心 应用篇
  3. c语言增强图像直方图均衡化,图像直方图均衡化增强opencv与C语言版
  4. 深度学习(三十六)——R-FCN, FPN, RetinaNet, CornerNet
  5. 在双系统(Windows与Ubuntu)下删除Ubuntu启动项
  6. c++builder中dbgrid控件排序_如何实现APP中各种布局效果?学会这几个控件就够了...
  7. 中国塑料泵行业市场供需与战略研究报告
  8. shiro的详细讲解
  9. 关于h5页面链接分享到微信的分享样式如何修改成自定义卡片
  10. C#调用谷歌翻译API
  11. 一代测序:又称Sanger测序(多分子,单克隆)
  12. 树莓派安装LibreOffice中文包
  13. m4a怎么转换成mp3,m4a转mp3的简单方法
  14. Scala 继承和特质
  15. Gartner云端盘点,浅谈2017IaaS魔力象限
  16. Java 确定线程池中工作线程数的大小
  17. kswapd和pdflush
  18. 在线考试系统总体设计
  19. 摄像模组中光学相关知识(三)
  20. Android Q版本读取SDcard

热门文章

  1. mybatis ew.sqlSegment @Param(“ew“)
  2. css 2D转换之旋转rotate
  3. Android 今日头条适配详解
  4. User Story
  5. 一天中最好的排毒时间
  6. Html5 canvas创意特效合集
  7. R-教材P110 条形图
  8. IKEA(宜家)营销神话——“让用户成为产品的创造者”!
  9. UOS桌面操作系统定制镜像(下)
  10. SERC 2013 E Skyscrapers