百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

mp4封装格式各box类型讲解及IBP帧计算

off999 2025-02-27 16:23 58 浏览 0 评论

mp4封装格式各box类型讲解及IBP帧计算

目录;总结送学习大纲 零基础到实战

    • box
    • ftyp box
    • moov box
    • mvhd box (Movie Header Box)
    • trak box (Track Box)
    • tkhd(track header box)
    • mdia (Track Media Structure)
    • mdhd (Media Header Box)
    • PTS和DTS的计算
    • I P B 帧的概念
    • stts(Decoding Time to Sample Box)
    • ctts(Composition Time to Sample Box)
    • timescale
    • stss (Sync Sample Box)
    • stsz (Sample Size Boxes):
    • stsc (Sample To Chunk Box):
    • stco (Chunk Offset Box)
    • mdat box

MP4文件封装格式,对应的标准为ISO/IEC 14496-12,即信息技术 视听对象编码的第12部分 ISO 基本媒体文件格式(Information technology Coding of audio-visual objects Part 12: ISO base media file format)

box

如果从整体上看,mp4所有的数据全部存放在 一个叫box的结构中。
box,顾名思义,可以简单地理解为一个
箱子 里面可以放任何符合大小的东西,也可以继续放箱子,箱子里面再放东西,这种箱子里面仍然放箱子的箱子称为容器箱子(container box) 你可以想象你要搬家,把你的家具全部放在一个个的箱子里面,然后一个大箱子把小箱子一个个再装箱。MP4中的 moov box 就是一种容器箱子。


box的字节序为网络字节序,也就是大端字节序(Big-Endian)Box由header和body组成,其中header统一指明box的大小和类型,body根据类型有不同的意义和作用。

box size 有三种可能:
1、通常的box开头的4个字节(32位)为box size,该大小包括box header和box body整个box的大小,这样我们就可以在文件中定位各个box。

2、如果 box size为1,则表示这个box的大小为large size(“mdat”类型)。

3、如果box size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)

size后面紧跟的32位为box type,一般是4个字符,如“ftyp”、“moov”等,这些box type都是已经预定好的,分别表示固定的意义。如果是“uuid”,表示该box为用户扩展类型,如果box type是未定义的,应该将其忽略。

14496-12标准中box的都有这些类型,这张表,也能从整体上了解完各类型box的说明:




MP4文件分析工具。

两个在线的MP4 分析工具,下面内容全部以此工具来分析一份demo
online-mp4-parser
online-mp4-parser-2

可以看到这份标准的mp4视频根路径上有四个box -- ftypmoovuuidmdat
ftyp 指定了文件类型
moov 保存了音视频数据的时空间信息
mdat 存放音视频数据

下面依赖工具简单依次分析一份普通mp4文件

ftyp box

该box有且只有1个,并且只能被包含在文件层,而不能被其他box包含。该box应该被放在文件的最开始,指示该MP4文件应用的相关信息。

“ftyp” body依次包括1个32位的major brand(4个字符),1个32位的minor version(整数)和1个以32位(4个字符)为单位元素的数组compatible brands。这些都是用来指示文件应用级别的信息。


moov box

moov box 是一个 container box 该box包含了文件媒体的元数据信息,具体内容信息由子box诠释。同File Type Box一样,该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现。

可以看到这个demo 中有 mvhd、trak、udta 三种 box 一般情况下 “moov”中会包含1个“mvhd”和若干个“trak”。其中“mvhd”为header box,一般作为“moov”的第一个子box出现。“trak”包含了一条音、视频轨/流/track的相关信息,也是一个container box。

该box是解析MP4文件里面最重要的一个box,它包含了音视频数据的编码格式、音视频数据样本,chunks的大小、存储位置也即偏移offset、时间戳单位、DTS,CTS(PTS),解码时间、显示时间等等...

moov box中记录的每帧音视频数据位置信息,实际上都在mdat box中,通过解析moov box来获取到每帧音视频数据具体位置后,使得播放器能方便的拖拉进度条。

mvhd box (Movie Header Box)

mvhd 描述了与具体音频或视频流无关的文件整体信息,其中的duration/timescale的值即为单位为秒的媒体时长。


trak box (Track Box)

trak也是一个container box,其子box包含了该track的媒体数据引用和描述。一个MP4文件中的媒体可以包含多个track,且至少有一个track,这些track之间彼此独立,有自己的时间和空间信息。“trak”必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box(略)。

tkhd(track header box)

tkhd 描述的该track的,如果是视频会有宽、高信息、 还有文件创建时间、修改时间等。


mdia (Track Media Structure)

mdia box 描述了这条音视频轨/流(trak)的媒体数据样本的主要信息,对播放器来说是一个很重要的box..

mdhd (Media Header Box)

当前音/视频轨/流(trak)的总体信息, 该box中有duration字段和timescale字段,duration/timescale的值即为当前流的时长。

hdlr box用来指定该流的类型


stsd box的子box用于保存该流的编码类型


avcC box指定了该流的编码类型为H264,储了解码所需的SPS、PPS信息。

stsc stsz stco三个box用于保存每帧视频或音频数据在文件中的保存位置。

stts stss ctts三个box用于保存媒体数据和时间戳的对应关系。

在同级的stbl的样本表box里面可以查到对应的样本 描述信息(stsd),时序信息(stts),样本的大小信息(stsz),样本到chunk的映射信息(stsc),chunk的位置信息(stco)等等

下面计算下PTS,来了解stbl box..

PTS和DTS的计算

I P B 帧的概念

在音视频中,为了提高压缩效率,会将每帧画面压缩为不同类型的视频帧数据。
I帧表示关键帧,包含有一帧画面的完整信息,解码时只需要本帧数据就可以解码出完整的一帧画面。
P帧表示前向参考帧,它保存了本帧与上一帧的差异信息,它不能单独解码,需要根据上一帧的画面加上本帧保存的差值来获取本帧的完整画面。
B帧为双向参考帧,它解码时需要依赖它之前和之后的帧来获取最终的画面
因为B帧需要依赖它后面的帧来进行解码,所以它的解码顺序就必然和显示顺序不能保持一致,这时就需要解码时间戳(DTS)和显示时间戳(PTS)来共同决定一帧视频数据何时解码,然后何时显示了。

举个例子
一小段视频帧序列如下 :
type : I --- B --- B --- P --- B --- B --- P
PTS : 0.33 0.67 1.00 1.33 1.67 2.00 2.33
DTS : 0.00 0.67 1.00 0.33 1.67 2.00 1.33

PTS >= DTS

根据mp4 stts和ctts 可以得到DTS和PTS

stts(Decoding Time to Sample Box)


stts 可以计算出每个sample的dts,其中sample_delta为该sample的dts相对于上一个smaple的差值,
那么此样本数据的dts为 :

0   1000 2000 3000 4000 ···

ctts(Composition Time to Sample Box)

Composition Time 构成时间目前我直接理解的PTS。。


ctts 有每个sample的构成时间(Composition Time)和解码时间(DTS)之间的差值(CTTS)即图中的composition_offset。
如果不存在ctts,则代表该流不存在B帧,那么PTS就直接等于DTS。

timescale

最后就是关于单位,你可以看到图中样本的单位都是以1000为单位浮动,实际上真实DTS和PTS时间是需要除以mdia/mdhd中的timescale。这里是30000。

有了这些,我们就可以在ctts里面计算出pts了 :

else if (box_type_equa(uint32_to_str(bh.type, sbuffer), "ctts")) { uint32_t version = 0; read_net_bytes_to_host_uint32(&box[8], &version); if(version != 0) { LOG_E("ctts unsupport version :%d ", version) return; } uint32_t entry_cnt = 0; read_net_bytes_to_host_uint32(&box[12], &entry_cnt); char buf[128] = {0}; tree_childs_insert_with_val(tree, "version", uint32_to_ascii(version, buf)); tree_childs_insert_with_val(tree, "entry_cnt", uint32_to_ascii(entry_cnt, buf)); uint32_t i = 0, j = 0, num = 0, pos = 16; for (i = 0; i < entry_cnt; i++) { uint32_t sample_cnt; read_net_bytes_to_host_uint32(&box[pos], &sample_cnt); pos += 4; uint32_t sample_offset; read_net_bytes_to_host_uint32(&box[pos], &sample_offset); pos += 4; for (j = 0; j < sample_cnt; j++) { PushBack_Array(pts_array, At_Array(dts_array, num++) + sample_offset); float dt, pt = 0.0; printf("dts : %9.3f ms | pts : %9.3f ms | \n", At_Array(dts_array, num - 1) / (mdhd_time_scale * 1.0), At_Array(pts_array, num - 1) / (mdhd_time_scale * 1.0)); }

stss (Sync Sample Box)

stss 里面存放了关键帧的序号(I帧),跳转时,需要从关键帧开始解码,否则会花屏。


stsz (Sample Size Boxes):

顾名思义,样本大小.

stsc (Sample To Chunk Box):

媒体数据的样本是被打包进chunks(块)的,chunks和样本(samples)的大小不固定,该box用于说明chunks关联样本的信息。

first_chunk 该入口第一个chunks的索引(index).
samples_per_chunk 样本数量/chunks.


stco (Chunk Offset Box)

描述每个chunks相对文件的偏移量。


如图 第一个chunks即前10个样本(此例), samples.1起始地址为 423257, samples.1的地址则为 423257 + 140798 = 564055, 依此类推...

有了这些即可计算出音视频的时间和空间信息了


总结:更多免费视频资料+学习路线+疑难解答+视频教程文档资料免费领取后台私信【学习】自行获取

内容包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体, WebRTC ,CDN,P2P,K8S,Docker,Golang, TCP/IP,MTK , 嵌入式 , 协程,DPDK等等 。

mdat box

Meida Data Box 媒体数据box 位于顶层,定义是一个字节数组,用来存储媒体数据。该box数量可以为0个,也可以有多个(当媒体数据全部为外部文件引用时),数据直接跟在box type字段后面,具体数据结构的意义需要参考metadata(主要在sample table中描述)。

相关推荐

永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

433游戏盒免费下载(433,游戏盒)

1、游戏盒中不同的小游戏都会有不同的游乐豆(在不同游戏中称呼不同),在不同的游戏中获取游乐豆的方式也是不相同的。比如欢乐斗地主这款小游戏,玩家可以通过不同的三种途径获得欢乐斗(即游乐豆)。  2、第一...

手机电视高清版下载安装(手机电视高清直播电视版下载)

电视机高清直播下载是指通过网络将高清直播信号传输到电视机上观看。这种方式可以让用户在电视上享受高清的直播内容,提供更好的观看体验。优点:高清画质:通过下载高清直播,可以获得更清晰、更细腻的画面效果,提...

necessary(necessary固定搭配)
necessary(necessary固定搭配)

necessary['nes?s(?)r?]adj.必要的;必需的;必然的n.必需品necessity[n?'ses?t?]详细?n.需要;必然性;必需品necessitate[n?'ses?te?t]详细?vt.使成为必需,需...

2026-02-04 05:43 off999

繁体字识别神器(繁体字扫一扫识别)

答:这个问题如果是撇开网络上的用语来回答的话,转繁体字根本不需要用工具,因为繁体字是在文字改革以前的原始写法,就按照原字体去写即可。中文简体转繁体工具,可以轻松将简体中文汉字替换成繁体中文汉字,若输入...

windows7原版iso镜像下载(windows7原版iso镜像安装教程)

Win7镜像文件官网下载地址是:<https://www.microsoft.com/zh-cn/software-download/home>Win7ISO镜像下载方法:1.打开浏览...

二人在手机下象棋(单人对机象棋(免费))
  • 二人在手机下象棋(单人对机象棋(免费))
  • 二人在手机下象棋(单人对机象棋(免费))
  • 二人在手机下象棋(单人对机象棋(免费))
  • 二人在手机下象棋(单人对机象棋(免费))
中英在线翻译(中英在线翻译入口)

1、腾讯翻译君是腾讯出品的实时语音对话翻译软件,支持中英日韩等多国语言。可以满足口语练习、办公查询、出国旅游的需求。它的界面极简,基佬紫为主基调,图标样式采用了流行的扁平化样式,除了基本的翻译功能外还...

山东省教育云服务平台(山东省教育云服务平台综合素质评价登录入口)

山东省教育云服务平台是山东省教育厅为广大学生和教师提供的一站式教育服务平台。以下是使用山东省教育云服务平台的一般步骤:1.打开山东省教育云服务平台的官方网站或手机APP(具体地址请咨询相关部门或学校...

12306抢票王极速抢票(极速抢火车票)

12306可以通过使用一些抢票软件实现一键抢票的功能,如12306助手等。首先,用户需要选择合适的软件并登录自己的12306账号。然后,设置好出行的日期和车次信息,并开启自动刷票功能。当车票开售时间到...

少年名将破解版无限元宝(少年名将单机破解版下载)

少年名将小程序中的元宝是一种虚拟货币,用于在游戏中购买道具、提升角色属性等。以下是一些使用元宝的建议,以最合适地利用它:1.提升角色属性:可以使用元宝购买强化丹、装备和技能书等道具,提升角色的战斗力...

取消回复欢迎 发表评论: