`
yuanlanjun
  • 浏览: 1186363 次
文章分类
社区版块
存档分类
最新评论

MP4文件格式详解——元数据moov(一)mvhd box

 
阅读更多

元数据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),对整个文件所包含的媒体数据作全面的全局的描述。包含了媒体的创建与修改时间时间刻度、默认音量、色域、时长等信息。

aligned(8) class MovieHeaderBox extends FullBox(‘mvhd’, version, 0) 
{ 
    if (version==1) 
    { 
        unsigned int(64) creation_time; 
        unsigned int(64) modification_time; 
        unsigned int(32) timescale; 
        unsigned int(64) duration; 
    } 
    else 
    { // version==0 
        unsigned int(32) creation_time; 
        unsigned int(32) modification_time; 
        unsigned int(32) timescale; 
        unsigned int(32) duration; 
    } 
    template int(32)  rate = 0x00010000; // typically 1.0 
    template int(16)  volume = 0x0100;  // typically, full volume 
    const bit(16)  reserved = 0; 
    const unsigned int(32)[2]  reserved = 0; 
    template int(32)[9]  matrix = { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 }; 
    // Unity matrix 
    bit(32)[6]  pre_defined = 0; 
    unsigned int(32) next_track_ID; 
} 
首先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 sincemidnight, 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 spatialinformation. 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文件格式解析 box说明

    MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。一个MP4文件...

    mp4转换为边下边播格式(moov前置)

    此程序将MP4文件转换为可边下边播的MP4文件 使用方式: 1.将要转换的MP4文件复制到文件夹src中 2.双击convert.bat执行转换,等待完成 3.转换完成的文件存储在文件夹target 注意: 此程序将会转换src目录下的所有MP4...

    QuikTime File Format(MP4格式文档)

    MP4文件格式分析 英文版 MP4文件头,ftyp,moov,mvhd,trak,tkhd 等等的最全面描述

    SourceCode.zip (Mp4 View VC2010)

    VC2010 编译成功, C语言解析MP4文件,逐个BOX分析,可以用来学习MP4格式。 解析MP4 Box模型,ftyp,moov, mdat , moov(mvhd , track。。。。 )。

    mp4box.js-3d-old:Fork for mp4 与 X3D 场景测试

    MP4Box.js 在浏览器中处理 MP4 ... 创建一个 MP4Box 对象,设置onReady回调并以 ArrayBuffer 对象的形式提供数据。 MP4Box.js 支持渐进式解析。 您可以一次提供小缓冲区,当解析“moov”框时将调用回调。 var mp4bo

    mp4box.js:GPAC的MP4Box工具JavaScript版本

    为此,创建一个MP4Box ISOFile对象,设置onReady回调并以ArrayBuffer对象的形式提供数据。 MP4Box.js支持渐进式解析。 您可以一次提供小缓冲区,当解析“ moov”框时将调用回调。 var MP4Box = re

    mp4结构查看器

    mp4结构查看器,包括了mp4,3gp的结构查看功能,方便用来分析视频文件结构

    qt-faststart:移动文件顶部的“moov”原子并通过添加适当的偏移量更新所有“stco”子原子指针

    它就地读取/修改/写入 mp4 文件,而不是将输出写入另一个文件。 它将被合并到nginx_http_mp4_module ,以便立即播放 mp4 文件而不是下载整个文件(以防 moov atom 放在最后) 编译: 运行make 使用: ./qt-...

    ngx_http_enhance_mp4_module:原始 nginx_http_mp4_module 的增强版本,它自动将 moov atom 从最后一个文件移动到文件开头,以启用文件可以立即流式传输而不是下载整个文件

    该模块使 nginx mp4 模块能够动态修改 mp4 文件( moov atom 放置在文件的最后一个)(仅一次),然后将其传送到视频播放器。这就是为什么为了提供 HTTP(RTMP 和其他可以做得更好)视频点播(使用ngx_...

    ffmpeg 合并文件异常.txt

    问题描述 ... ffmpeg -y -i concat:"1.mp4|2.mp4|...合并后只有一个文件的长度 采用文件方式 ffmpeg -f concat -i list.txt -c copy 1.mp4 本资源采用 ffmpeg concat 命令前,将mp4文件转换为指定编码后即可顺利合并为1个

    3gp,mp4,m4a,mov编辑器

    可将 MP4/M4A/M4V/MOV/3GP/3GP2/3GPP/3G2 等文件按照持续时间/轨道数目/文件大小任意分割,或将其所支持的全部视频/音频格式合并为 MPEG-4/3GPP 文件。 3):轨道抽取: 可任意抽取容器文件中的视频、音频、文本...

    Mio Moov 200 firmware

    Mio Moov 200 original firmware V1.00.0025

    mp4v2封装MP4示例工程

    MP4 视频格式处理的利器!封装 H264 和 AAC 到 MP4 中的经典,可以音视频同步、设置任意分辨率、录制时间!

    f4v-moov

    f4v-moov

    MoovMisManage:Moovbox 管理不善工具

    Moovbox 管理不善实用程序。 来自 Icomera Moovbox 产品的材料(工具、代码、密钥和证书)的转储,针对 BSides Hannover 谈话进行了逆向工程。 幻灯片 您可以找到幻灯片 内容 ###./openvpn_keys:从设备中提取的 ...

    mp4info.exe

    可以非常清晰地看到查看mp4类型多媒体文件的ftyp/moov/mdat等信息.绿色软件,打开即用。非常小巧

    mp4 info查看工具

    可以查看mp4的box 比较方便直观,很容易可以看到moov里面的trak stbl box的内容

    paperclip-av-qtfaststart:修复 FFmpeg MP4 视频文件

    当 FFmpeg 生成 mp4 文件时,它会将 moov 原子放在最后,使其无法流式传输。 要解决此问题,请在使用对视频文件进行转码后使用此处理器运行 qtfaststart 在您的模型中: class Lesson ...

    faststarFramework:mp4的moov置前

    faststarFrameworkfaststarVideoFramework前面写到,有个被偏方取代的问题,就是部分mp4中moov位于末尾无法实现边下边播的问题。先找到了解决方案,并写了个库供大家使用:// mp4的moov置前#import &lt;Foundation&gt;@...

    Mp4 Box infomation

    按字节将Mp4 box解析为树,显示在树控件中

Global site tag (gtag.js) - Google Analytics