元数据moov(一)(ISO-14496-12)

Author:Pirate Leo

Email:codeevoship@gmail.com

ISO 14496 - 12 定义了一种封装媒体数据的基础文件格式,mp4、3gp、ismv等我们常见媒体封装格式都是以这种基础文件格式为基础衍生的。

如果从全局角度了解基础文件格式,请看我之前的博文《MP4文件格式详解——结构概述》。

本系列文档从MP4文件入手,对文件中重要的box进行解析。

<======================================================================>

本次解析moov box,也称movie box。

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用来保存这些信息?

看过我第一篇文章《MP4文件格式详解——结构概述》的人肯定对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 plaincopyprint?
  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(一)mvhd box相关推荐

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

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

  2. MP4文件格式详解——结构概述

    MP4文件格式详解(ISO-14496-12/14) 一.基本概念 1. 文件,由许多Box和FullBox组成. 2. Box,每个Box由Header和Data组成. 3. FullBox,是Bo ...

  3. MP4文件格式详解——文件类型ftyp

    原谅地址:http://blog.csdn.net/pirateleo/article/details/7583321 文件类型ftyp(ISO-14496-12) Author:Pirate Leo ...

  4. MP4文件格式详解——文件类型ftyp(转)

    文件类型ftyp(ISO-14496-12) Author:Pirate Leo Email:codeevoship@gmail.com ISO 14496 - 12 定义了一种封装媒体数据的基础文件 ...

  5. 多媒体 MP4文件格式详解——文件类型ftyp

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

  6. MP4文件格式详解(ISO-14496-12/14)

    一.基本概念 1. 文件,由许多Box和FullBox组成. 2. Box,每个Box由Header和Data组成. 3. FullBox,是Box的扩展,Box结构的基础上在Header中增加8bi ...

  7. Ffmpeg快速命令使用 Ffmpeg选项详解 Ffmepg格式详解 常见视频文件格式详解

    http://www.ffmpeg.com.cn/index.php/%E9%A6%96%E9%A1%B5 Ffmpeg快速命令使用 From Ffmpeg工程组 Jump to: navigatio ...

  8. 刻录启动镜像之一:镜像文件格式详解

    刻录启动镜像之一:镜像文件格式详解 Disk Image CD/DVD Live CD .iso .bin / .raw / .img .cue .dmg .nrg Disk Image 磁盘映像是包 ...

  9. 音视频入门-17-GIF文件格式详解

    * 音视频入门文章目录 * GIF 文件格式解析 图像互换格式主要分为两个版本,即图像互换格式 87a 和图像互换格式 89a. 图像互换格式 87a:是在 1987 年制定的版本. 图像互换格式 8 ...

  10. S19文件格式详解(总结)以及与hex文件的互转

    S19文件格式详解 ​​ ​​ S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motoro ...

最新文章

  1. (转) Twisted :第二十一部分 惰性不是迟缓: Twisted和Haskell
  2. 新方向!DeepMind提出人工生命框架,促进智能生物体的出现
  3. c语言用数组实现循环移位,如何将一个数组的元素循环左移?
  4. C++实现虚拟内存页面置换算法(FIFO, OPT, LRU)
  5. as3转换为html5,AS3和HTML5 - 使用正则表达式将字符串解析为数组
  6. mysql sha256函数_MySQL8.0新特性——默认使用caching_sha2_password作为身份验证插件
  7. 为什么大多数程序员都抽烟_为什么大多数重新设计都会失败
  8. 性能调优的方法及概念
  9. PHP+MySql获取新添加记录的ID值
  10. 接口测试工具-Jmeter使用笔记(九:跨线程组传递变量)
  11. 【论文解读】MmWave Radar and Vision Fusion for Object Detection in Autonomous Driving: A Review
  12. ONMF正交非负矩阵分解·论文总结
  13. 关于MATLAB的saveas函数错误
  14. C语言程序实例100个
  15. listview(retrofit)
  16. 最新PHP全自动发信投稿系统源码+带后台
  17. 一个和CSDN类似的博客网站
  18. MSN登陆错误解决方法
  19. 小程序js+django+服务器后台搭建流程总结(第五周学习记录)
  20. FPGA-自动售货机verilog

热门文章

  1. 自媒体会否是独立游戏的出路?
  2. 阿里云网络和安全配置实验(云计算)
  3. Docker深入浅出系列
  4. 企业微信获取临时素材,此处接口为语音接口
  5. 设置win10锁屏壁纸为桌面背景
  6. CF1680F Lenient Vertex Cover题解
  7. 华为公司大数据中台架构分享
  8. 数据分析-PART1--数据获取和步骤
  9. 如何在word中的方框里打钩
  10. 给对象添加一个新对象