大家好,我是讯享网,大家多多关注。
1.MP4分析工具
mediainfo
MP4 box:http://download . TSI . telecom-Paris tech . fr/gpac/MP4 box . js/filereader . html
对于Mp4来说,都是盒子来组织元素。比如竖框就是盒子,这里重点说一下moov。Mp4⽂由盒子组成,每个盒子又分为报头和数据。头部分包含盒子的类型,数据包含盒子或数据,盒子可以嵌套盒子。MP4的基本单位是盒子,也就是说MP4是由各种盒子组成的,包括父盒子和子盒子。因此,这些框之间有明确的层次关系,总结如下表所示,其中每个框的必选或可选特性都有标记,打√表示必选框。
下图显示了典型mp4⽂:的基本结构
Hexinator:
Mp4box和mediainfo的对比。
这个trak表示音频和视频有多少个通道。每个av流对应于一个轨道。每个轨道可以具有宽度和高度信息、编译器信息、采样率、通道、时基(time_scale)。
意味着轨道宽度和高度使用4个字节。
视频和音频的时间尺度不一样。
音频和视频处理程序也不同。
更重要的样表。
一个MP4文件被分成多个音轨,一个音轨被分成多个组块,一个组块有多个样本。Mp数据索引和实际数据存储在不同的区域。
先用数据索引找moov,再找mdat。
下面解释的是chunk1-84,都对应一个样本,chunk85,两个样本,chunk86-88,一个样本,chunk89,两个样本,chunk90,一个样本。
可以根据样本大小读取每帧数据的大小。
ftyp
文件类型框,一般在片的开头,描述片的版本,兼容协议等。
moov
电影盒子,包含本文档中所有媒体数据的宏描述信息和每个媒体轨道的具体信息。被放在文件的末尾,但是如果你想下载和播放http,你需要提前moov。请注意,在更改moov位置时,需要重新计算一些内部值。
mdat
媒体盒,存储特定的媒体数据。
Moov内幕
mp4的媒体数据信息主要存储在Moov盒子中,这是我们分析的重点。moov的主要组成部分如下:
mvhd
电影头框,记录整个媒体片的描述信息,如创建时间、修改时间、时间度量尺度、可播放时间等。
在下面的例子中,获取片段信息的时间是持续时间:5016毫秒。
udta
用户数据框,定义数据。
轨道
记录媒体流信息的轨道可以包含一个或多个彼此独立的轨道。
每个轨道由以下部件组成:
tkhd
轨道头框,包含媒体流的头信息。在以下示例中,您可以看到视频流宽度800和度数1920等流信息。
频率tkhd,比如时长,音量等。
mdia
媒体盒,这是一个包含轨道媒体数据信息的容器盒。⼦box包括:
Mdhd:媒体头框,存储视频流的创建时间、度等信息。
Hdlr:Handler引用框,媒体播放过程的信息。
Minf:媒体信息框,解释轨道媒体数据的处理程序特定信息。Minf也是一个containerbox,内部需要注意的内容是stbl,这也是moov最复杂的部分。Stbl包含媒体流中每个样本的偏移量、pts、持续时间和其他信息。要播放mp4⽂作品,必须根据stbl正确找到每个样本,并将其发送到解码器。
Mdia扩展如下图所示:
mdhd
媒体头框,存储视频流的创建时间、度数等信息。视频的Mdhd、时间刻度、时长等信息。
Mdhd,类似于视频,但要注意时间尺度。当我们计算时间戳时,我们应该使时间刻度对应于我们流的av stream->:Time _ base .
hdlr
处理程序参考框,关于媒体播放过程的信息。视频的Hdlr,侧重于分量子类型:vide。
频率hdlr,组件子类型:soun,如果我们有多个音轨,组件名称:粤语。
我们分析的零件各不相同,按照不同的名称来区分。
minf
Minf:媒体信息框,解释轨道媒体数据的处理程序特定信息。Minf也是一个containerbox,内部需要注意的内容是stbl,这也是moov最复杂的部分。Stbl包含媒体流中每个样本的偏移量、pts、持续时间和其他信息。要播放mp4⽂作品,必须根据stbl正确找到每个样本,并将其发送到解码器。
而且需要注意的是,Minf的容器、频率和视频轨道是有区别的,比如视频轨道:vmhd和频率轨道:smhd。
vmhd
smhd
Stbl内幕
样本表盒,上面提到的mdia最重要的部分就是存储中每个样本信息的stbl。在分析stbl之前,我们需要区分chunk和sample这两个概念。
在mp4⽂中,样本是媒体流的基本单位,例如,视频流的每个样本代表实际的nal数据。组块是数据存储的基本单位。它是一个系列样本数据的集合。每个块可以包含一个或多个样本。
Stbl⽤描述了每个样本的信息,包括以下主要框:
stsd
样本盒,存储解码所需的描述信息。在下面的例子中,h264的视频流的具体类型是avc1,并且扩展存储必要的解码信息,例如sps和pps。
视频的Stsd
包括Avc1,avc1包括avcC和pasp。
Avc1:包括视频宽度和高度。
AvcC:包含视频编码器相关信息,包括sps,pps等。
频率的标准偏差
Hexinator分析包含音频相关信息,如采样率和通道号。
stts
当定义每个样本时,“采样时间”框。采样时间的表格条目布局如下:
Sttable条目布局
样本数:样本的数量。
样本持续时间:样本持续时间。
相同持续时间的连续样本可以放在entry⾥中保存空。这首先给出了stts,即视频的条目数。这个参数需要注意的是,它不是样本数。实际样本数需要将每个条目的样本数加起来才是真正的样本数。
在下面的例子中,第一个采样时间是3720,⽤mdhd的时间刻度被转换,例如视频是90000,转换后的秒是3720/90000 = 0.0413333333333秒。
另一个频率的stts只是mdhd的时间尺度之差。在我们看到频率是44100之前,我们计算了第一个样本的时间。1024/44100=0.0232199546485261秒。
stss
Syncbox,同步样表,存储关键帧列表,用于随机访问。
stss的表项布局如下:
Sttable条目布局
在下面的示例中,该视频轨道有3个关键帧:
stsc
样本-组块盒,样本-组块映射表。
如上所述,mp4通常将样本封装成一个组块,一个组块可能包含一个或两个样本。样本到块原子的表条目布局如下图所示:
第一个块:制作这个条目的第一个块序列号。
每个块的样本数:使该表项的块包含样本。
样本id:stsd条目的序列号,使该条目的块被引用。
在下面的例子中,您可以看到这个视频track⼀总共有1个stsc条目,块序列1-x,每个块包含一个样本。这意味着每个块只有一个样本(一个块可以有多个样本)。
stsz
样本框,指定每个样本的大小。Sample atom包含两个样本总数和一个包含每个样本大小的表格。
示例表的条目布局如下:
在以下示例中,该视频流中有110个样本,第一个样本为42072字节,第二个样本为7354字节。
stco
块偏移框,指定每个块在小部件中的位置。该表是确定每个样本在小部件中的位置的关键。此表包含块的数量和一个包含块中每个块的偏移位置的表。每个条目的内存布局如下:
注意,这个⾥stco只指定了小部件中每个块的偏移位置,并没有给出小部件中每个样本的偏移。为了获得每个样本的偏移位置,需要结合样本大小盒(stsz)和样本到组块(stsc)的计算。
在下面的例子中,视频流中第一个组块的偏移量是4750,也就是说每个组块只有一个样本,第一个样本的起始位置是4750->: 0x1D78,数据参考stsz,第一个样本大小是172818。
例如偏移位置,7544–>:0x1d 78 .
如何计算样本偏移位置
上面提到样本的偏移位置不能通过stco直接获得,下面的例子说明了如何获得样本在对应于pts的部分中的位置。
需要采取以下步骤:
(1)将pts转换为媒体对应的时间坐标系。
(2)根据stts((解码)采样时间)计算对应于pts的采样序列号。
(3)根据stsc(sample-to-chunk),计算样本序列号存储在哪个chunk中。
(4)根据stco(chunk offset ),获得相应组块在该块中的偏移位置。
(5)根据stsz获取样本在组块中的偏移位置,加上步骤4中获取的偏移,计算样本在零件中的偏移。
例如,您想要获得3.64秒视频样本数据在软件中的位置。
(1)根据时间刻度参数,将3.64秒换算成视频时间轴对应的3640000(如果时间刻度不是毫秒)。
视频轨道:时间刻度为90000,对应的时间戳为3.64秒*90000。
(2)遍历并累加下表所示的所有stts项,计算出3640000位于第110个样本= 327600。
(3)多个sample_deltas叠加计算达到327600。我们取3780为平均值,实际上是3720*1+3780*1+3690*1+3780*2………………………………………………………………………….27600/3780 = 86.66666666667,四舍五入到86。
(4)查询下表所示的stsc的所有项,计算出第86个样本位于第86个组块,它位于这个组块中的第1个样本(因为我们的码流对应每个组块的一个样本)。
(5)查询下表所示的所有stco项,得到该块中第86个chunk的偏移位置为1004678。打造⽤hexinator.
(6)查询下表所示的stsz的所有项目,第86个样本的大小为20934。一块算3.64秒的视频样本数据。
偏移量:1004678+0 = 1004678
尺码:20934 .
验证:编辑器打开mp4⽂,并将其定位在偏移量1004678处。09分隔符,占用6个字节。如果你看真实数据区,前4个字节也是NALU的度数0x000051bc=20924。
总字节数的计算方法是4+2+4+20924 = 20934。
整理mp4协议要点,阅读协议薄;
具有多个样本的组块场景被链接到参考下的分析中:
https://www.jianshu.com/p/44c9567d8fcbmp4⽂模式解析
这篇文章的分析到此为止,对MP4的非常详细的分析。如果对你有用,可以关注,喜欢,收藏,转发。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/37612.html