movie box —— container box whose sub-boxes define the metadata for a presentation (‘moov’)

moov包含的一系列次级box中存储着媒体播放所需的元数据(metadata)。

两点疑问:什么是元数据?moov有哪些次级box?

1)元数据:描述数据的数据。针对媒体文件而言元数据都有哪些呢?为了让大家直观了解:

上图是使用“格式工厂”获取某MP4文件的媒体信息,这些媒体信息基本都包含在moov中。

视频包括编码等级、分辨率、色域、码率、帧率、位深、时长等等……

音频又包括声道、采样率等音频特有属性。

这些元数据对于我们的价值在于:我们的系统(比如PC播放器,高清播放机)可以通过对moov box的解析,自动适配运行在某种模式下去播放影片。在嵌入式领域,由于DSP或ARM的Ram空间有限,经常需要动态加载本次播放所需的解码器(算法程序),通过自适配可以用最廉价的CPU,完成一款支持多码率多格式的全能播放器。

2)moov有哪些次级box用来保存这些信息?

moov

container for all the metadata

mvhd

movie header, overall declarations

trak

container for an individual track or stream

tkhd

track header, overall information about the track

tref

track reference container

edts

edit list container

elst

an edit list

mdia

container for the media information in a track

mdhd

media header, overall information about the media

hdlr

handler, declares the media (handler) type

minf

media information container

vmhd

video media header, overall information (video track only)

smhd

sound media header, overall information (sound track only)

hmhd

hint media header, overall information (hint track only)

nmhd

Null media header, overall information (some tracks only)

dinf

data information box, container

dref

data reference box, declares source(s) of media data in track

stbl

sample table box, container for the time/space map

stsd

sample descriptions (codec types, initialization etc.)

stts

(decoding) time-to-sample

ctts

(composition) time to sample

stsc

sample-to-chunk, partial data-offset

information

stsz

sample sizes (framing)

stz2

compact sample sizes (framing)

stco

chunk offset, partial data-offset information

co64

64-bit chunk offset

stss

sync sample table (random access points)

stsh

shadow sync sample table

padb

sample padding bits

stdp

sample degradation priority

sdtp

independent and disposable samples

sbgp

sample-to-group

sgpd

sample group description

subs

sub-sample information

先对两个重要的box作功能上的描述,每个box具体组成细节在以后的篇幅中将详细介绍。

mvhd ——This box defines overall information which is media-independent, and relevant to the entire presentation.

全文件唯一的(一个文件中只能包含一个mvhd box),对整个文件所包含的媒体数据作全面的全局的描述。包含了媒体的创建与修改时间时间刻度、默认音量、色域、时长等信息。

[cpp]  view plain copy print ?
  1. aligned(8) class MovieHeaderBox extends FullBox(‘mvhd’, version, 0)
  2. {
  3. if (version==1)
  4. {
  5. unsigned int(64) creation_time;
  6. unsigned int(64) modification_time;
  7. unsigned int(32) timescale;
  8. unsigned int(64) duration;
  9. }
  10. else
  11. { // version==0
  12. unsigned int(32) creation_time;
  13. unsigned int(32) modification_time;
  14. unsigned int(32) timescale;
  15. unsigned int(32) duration;
  16. }
  17. template int(32)  rate = 0x00010000; // typically 1.0
  18. template int(16)  volume = 0x0100;  // typically, full volume
  19. const bit(16)  reserved = 0;
  20. const unsigned int(32)[2]  reserved = 0;
  21. template int(32)[9]  matrix = { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 };
  22. // Unity matrix
  23. bit(32)[6]  pre_defined = 0;
  24. unsigned int(32) next_track_ID;
  25. }

首先mvhd是个Full Box,引用我第一篇文中解释:“  FullBox,是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags。 ”,见下图:

图中标红的是moov box的长度与标识(其实这种box结构类似TLV,称为LTV更直观)。

标蓝的是mvhd的长度0x6c,表黄的是mvhd的标识与内容:

0x6D766864 是mvhd的ASCII标识;

0x00000000 是FullBox扩展出来的标识位,这里是全0,Version和flags都是0,参见前面的结构定义可知后面的时间与时长采用了32bit表示方式。

第一个0x7C25B080是创建时间,第二个0x7C25B080是最后修改时间。可见媒体未被修改过。这两个数值是怎么描述具体时间的呢?

time is an integer that declares the creation time of the presentation (in seconds since midnight, Jan. 1, 1904, in UTC time)

即,从UTC时间的1904年1月1日0点至今的秒数。我们手动算一下:

0x7C25B080 = 2082844800秒,大概是66.0465年(每年按365天算,不考虑闰年),1904+66=1970年中。看来这个媒体文件生成的并不规范,没有按照ISO的规范填写创建与修改时间(by the way,该文件是一年前使用iKu转码生成)。不过这里的时间并不影响播放器识别并播放影片。

我们假设4字节的时间描述取其最大值0xFFFFFFFF,通过计算最多支持到2040年。如果,假设该参数是播放视频所必备的参数,那么到2040年后,也许所有的MP4文件一夜间就无法播放了~(0 == Version这种)。

0x000003E8 是timescale,该数值表示本文件的所有时间描述所采用的单位。0x3E8 = 1000,即将1s平均分为1000份,每份1ms。

0x000A06A2 是duration,媒体可播放时长,0xA06A2 =  657058,这个数值的单位与实际时间的对应关系就要通过上面的timescale参数。

duration / timescale = 可播放时长(s)。这里算出该视频能播放657.058s。使用MPC打开,时长与我们计算的一致。

timescale时间刻度贯穿在整个文件中,所有对于时间的描述都要以其为参照,例如解码时间DTS,展示时间PTS等最重要的时间描述。

0x00010000 媒体速率,这个值代表原始倍速。

0x0100 媒体音量,这个值代表满音量。

接下来的一系列值都是结构中的预定义值,参见结构定义即可。

trak——This is a container box for a single track of a presentation. A presentation consists of one or more tracks. Each track is independent of the other tracks in the presentation and carries its own temporal and spatial information. Each track will contain its associated Media Box.

其次级box中包含了单个媒体轨道(Track)所特有的描述信息。

我们知道一部视频一般都有多个轨道组成。

例如,《让子弹飞》的正版DVD,1)有一条视频轨用于电影画面。2)至少有两条音频轨分别提供了普通话与四川话版,实际上为了营造更加逼真的现场效果,为了配合多声道家庭影院该影片还独有一条音效轨。3)多条字幕轨,简体中文,繁体中文,英文……。从中我们可以理解为什么trak box可以有多个:每个track都是独立的,具有自我特征与属性的,因此需要各自描述互不干涉。

我们一般所看的MP4文件中moov下都至少是mvhd-trak-trak-trak...这种构成。

后续将对trak下的一系列子box进行解析

MP4格式分析之元数据moov(一)相关推荐

  1. MP4文件格式详解——元数据moov(二)tkhd box

    ISO 14496 - 12 定义了一种封装媒体数据的基础文件格式,mp4.3gp.ismv等我们常见媒体封装格式都是以这种基础文件格式为基础衍生的. 如果从全局角度了解基础文件格式,请看我之前的博文 ...

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

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

  3. 超详细MP4格式分析

    1.MP4解析工具 mediainfo mp4box:http://download.tsi.telecom-paristech.fr/gpac/mp4box.js/filereader.html 对 ...

  4. mp4格式解析、分割

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

  5. 封装格式分析-MP4

    声明:MP4 的封装格式是比较复杂的,本文不会把 MP4 的各个字段,各种场景用法都罗列出来,那样会形成一个手册. 文本主要讲解 MP4 这种封装格式在音视频开发中比较常用的字段,还有一些关键的知识点 ...

  6. 分析一下mp4格式的trak -> mdia -> minf -> stbl -> stts、stsc 这两个box信息

    分析一下mp4格式的trak -> mdia -> minf -> stbl -> stts.stsc 这两个box信息 (因为这两个box在音频trak和视频trak 下都有 ...

  7. 使用ffmpeg将mp4格式视频元数据信息转到视频第一帧、转换mp4为ts格式视频

    最近在研究web一些播放器,videojs\ckplayer\jwplayer等各种页面播放器,发现在播放视频的时候,有些mp4格式的视频是不能够边缓存边播放的,在网上查阅了一些资料,发现是这些mp4 ...

  8. <整理总结>H264/265码流数据包格式分析(带mp4v2封装H264/265为MP4的源码示例)

    H264/265码流数据包格式分析 前言: 一.H.264码流解析 I帧P帧B帧说明: 二.H.265码流解析 三.主要源码 前言: 最近在学习使用MP4v2将H264/H265码流以及AAC音频封装 ...

  9. mp4格式文件转码后处理(qt-faststart工具介绍)

    当前很多工具能提供mp4格式的转换输出,但有时输出的格式拿到网络上后发现需要完整下载后才能开始播放,而不能像网上的很多视频那样一开始就能播放(边下边放),造成这个问题的原因是一些描述mp4文件信息的m ...

最新文章

  1. 浏览器中可以运行Window2000,WebAssembly 是 JavaScript 的末日?
  2. 在 BT5 下对 Red Hat Enterprise Linux 5.4 的一次***测试
  3. github--新手使用错误分析
  4. 让人期待的Visual Studio 2010
  5. python-day8-赋值
  6. 线性回归 —— python
  7. 支付361万元“家庭抚养费”后,贾跃亭向法院申请与甘薇离婚?
  8. c# windows服务状态、启动和停止服务
  9. 目标跟踪之光流法---光流法简单介绍
  10. 错误代码:1120当前Hsql数据库已被另一线程锁定
  11. 一个app项目如何从想法一步一步落地?有哪些必要的流程?
  12. 从单机到多机:多机一定比单机快吗?秒杀系统到底有没有必要用分布式锁?
  13. SQL50题(MySQL)
  14. html毕业答辩ppt,毕业论文答辩PPT怎么写? 经验告诉你该这样
  15. Linux字体关联到wine中,Wine的中文显示与字体设置
  16. Jquery文本域(textarea)改变事件
  17. 制作简单大气的倒计时时钟(带源码)js+css+html
  18. AppleScript 脚本让 Mac 唱生日快乐歌
  19. Jeston Nano国产主板使用注意事项
  20. SQL server 2008基本语句大全与提升语句

热门文章

  1. Revit二次开发之移动元素【比目鱼原创】
  2. 郑州哪家公司网站建设比较好?
  3. 微软Windows Phone7超越Android、iOS的五大优势
  4. ue4——攀爬系统的实现与总结
  5. React+ Dva + Atd入门知识(必读)——框架详解
  6. 源码学习---Activity之managedQuery()
  7. 南斯拉夫 苏联 捷克斯洛伐克
  8. 2021最新超人社区二手跳蚤市场 V6. 6.2版
  9. 8. fastApi请求错误处理方式与示例
  10. FormData使用方法详解