以下转自:http://blog.csdn.net/yu_yuan_1314/article/details/9289827

MP4文件的基本单元是“box”,这些box既可以包括data,也可以包括metadata。MP4文件标准允许多种方式来组织data box和metadata box。将metadata放在data之前,客户端应用程序可以在播放video/audio之前获得更多的关于video/audio的信息,因此这种方式在大多数的多媒体应用场景都是比较有用的。但是,在流媒体应用场景,不可能预先保存关于整个流数据的metadata信息,因为不可能提前完全知道。而且,预先保存的metadata越少就意味着越少的开销,因此也可以缩短启动时间。

MP4 ISO Base Media文件格式标准允许以fragmented方式组织box,这也就意味着MP4文件可以组织成这样的结构,由一系列的短的metadata/data box对组成,而不是一个长的metadata/data对。Fragmented MP4文件结构如图1所示,图中只给出了两个fragments。

图1 Fragmented MP4文件结构

在Fragmented MP4文件中都有三个非常关键的boxes:‘moov’、‘moof’和‘mdat’。

(1)‘moov’(movie metadata box)

和普通MP4文件的‘moov’一样,包含了file-level的metadata信息,用来描述file。

(2)‘mdat’(media data box)

和普通MP4文件的‘mdat’一样,用于存放媒体数据,不同的是普通MP4文件只有一个‘mdat’box,而Fragmented MP4文件中,每个fragment都会有一个‘mdat’类型的box。

(3)‘moof’(movie fragment box)

该类型的box存放的是fragment-level的metadata信息,用于描述所在的fragment。该类型的box在普通的MP4文件中是不存在的,而在Fragmented MP4文件中,每个fragment都会有一个‘moof’类型的box。

一个‘moof’和一个‘mdat’组成Fragmented MP4文件的一个fragment,这个fragment包含一个video track或audio track,并且包含足够的metadata以保证这部分数据可以单独解码。Fragment的结构如图2所示。

图2 Fragment的结构

上面两张图片来自http://alexzambelli.com/blog/2009/02/10/smooth-streaming-architecture

图3是用MP4Info工具查看的一个Fragmented MP4文件的结构,该文件是通过MP4Box工具,通过下面的一个命令转化出来的一个文件。图4是与之对应的普通的MP4文件结构。

#MP4Box -dash 500000 -frag 50000 -rap file_name.mp4

由于设置的时间参数较大,因此得到的Fragmented MP4文件中仅仅包含四个fragments(每个fragment由一对‘moof’和‘mdat’组成)。

图3 MP4Info显示的Fragmented MP4文件结构

图4 MP4Info显示的普通MP4文件结构

转自:http://blog.csdn.net/zhuweigangzwg/article/details/17222951

一、基本概念

1.mp4概述

MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。

下面是一些概念:

track 表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。

hint track 这个特殊的track并不包含媒体数据,而是包含了一些将其他数据track打包成流媒体的指示信息。

sample 对于非hint track来说,video sample即为一帧视频,或一组连续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。对于hint track,sample定义一个或多个流媒体包的格式。

sample table 指明sampe时序和物理布局的表。

chunk 一个track的几个sample组成的单元。

在本文中,我们不讨论涉及hint的内容,只关注包含媒体数据的本地MP4文件。下图为一个典型的MP4文件的结构树。

2、Box

首先需要说明的是,box中的字节序为网络字节序,也就是大端字节序(Big-Endian),简单的说,就是一个32位的4字节整数存储方式为高位字节在内存的低端。Box由header和body组成,其中header统一指明box的大小和类型,body根据类型有不同的意义和格式。

标准的box开头的4个字节(32位)为box size,该大小包括box header和box body整个box的大小,这样我们就可以在文件中定位各个box。如果size为1,则表示这个box的大小为large size,真正的size值要在largesize域上得到。(实际上只有“mdat”类型的box才有可能用到large size。)如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)

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

(1、 mp4文件由许多Box和FullBox组成。

(2、 Box,每个Box由Header和Data组成。

(3、 FullBox,是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags。

(4、 Header,包含了整个Box的长度size和类型type。当size==0时,代表这是文件中最后一个Box;当size==1时,意味着Box长度需要更多bits来描述,在后面会定义一个64bits的largesize描述Box的长度;当type是uuid时,代表Box中的数据是用户自定义扩展类型。

(5、 Data,是Box的实际数据,可以是纯数据也可以是更多的子Boxes。

(6、 当一个Box的Data中是一系列子Box时,这个Box又可成为Container Box。当一个Box里面不包含子Box时,这个Box称为leaf Box,而FullBox是mp4格式协议规定的某些特殊的Box。

Box header的结构用伪代码表示如下:

[cpp] view plain copy
  1. aligned(8)classBox (unsignedint(32) boxtype,optional unsignedint(8)[16] extended_type)
  2. {
  3. unsigned int(32) size;
  4. unsigned int(32) type = boxtype;
  5. if(size==1)
  6. {
  7. unsigned int(64) largesize;
  8. }
  9. elseif(size==0)
  10. {
  11. // box extends to end of file
  12. }
  13. if(boxtype==‘uuid’)
  14. {
  15. unsigned int(8)[16] usertype = extended_type;
  16. }

结构如下图:

BOX结构描述图

二、MP4文件格式(ISO-14496-12/14)

MP4文件就是由各式各样的Box组成的,下表中列出了所有必选或可选的Box类型,√代表Box必选。

ftyp

file type and compatibility

pdin

progressive download information

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

mvex

movie extends box

mehd

movie extends header box

trex

track extends defaults

ipmc

IPMP Control Box

moof

movie fragment

mfhd

movie fragment header

traf

track fragment

tfhd

track fragment header

trun

track fragment run

sdtp

independent and disposable samples

sbgp

sample-to-group

subs

sub-sample information

mfra

movie fragment random access

tfra

track fragment random access

mfro

movie fragment random access offset

mdat

media data container

free

free space

skip

free space

udta

user-data

cprt

copyright etc.

meta

metadata

hdlr

handler, declares the metadata (handler) type

dinf

data information box, container

dref

data reference box, declares source(s) of metadata items

ipmc

IPMP Control Box

iloc

item location

ipro

item protection

sinf

protection scheme information box

frma

original format box

imif

IPMP Information box

schm

scheme type box

schi

scheme information box

iinf

item information

xml

XML container

bxml

binary XML container

pitm

primary item reference

fiin

file delivery item information

paen

partition entry

fpar

file partition

fecr

FEC reservoir

segr

file delivery session group

gitn

group id to name

tsel

track selection

meco

additional metadata container

mere

metabox relation

先简单介绍几个重要的box,以便诸位在后续学习时心中有数:

1、 ftyp box,在文件的开始位置,描述的文件的版本、兼容协议等;

2、 moov box,这个box中不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述信息,moov box下有mvhd和trak box。

>>mvhd中记录了创建时间、修改时间、时间度量标尺、可播放时长等信息。

>>trak中的一系列子box描述了每个媒体轨道的具体信息。

3、 moof box,这个box是视频分片的描述信息。并不是MP4文件必须的部分,但在我们常见的可在线播放的MP4格式文件中(例如Silverlight Smooth Streaming中的ismv文件)确是重中之重。

4、 mdat box,实际媒体数据。我们最终解码播放的数据都在这里面。

5、 mfra box,一般在文件末尾,媒体的索引文件,可通过查询直接定位所需时间点的媒体数据。

附:Smooth Streaming中ismv文件结构,文件分为了多个Fragments,每个Fragment中包含moof和mdat。这样的结构符合渐进式播放需求。(mdat及其描述信息逐步传输,收齐一个Fragment便可播放其中的mdat)。

************************************

** 文件类型ftyp **

************************************

ftyp box 的数据结构的伪代码表示:

[cpp] view plain copy
  1. aligned(8)classFileTypeBox extends Box(‘ftyp’)
  2. {
  3. unsigned int(32) major_brand;
  4. unsigned int(32) minor_version;
  5. unsigned int(32) compatible_brands[];// to end of the box
  6. }

什么是brands?官方是这样描述的:

Each brand is a printable four-character code, registered with ISO, that identifies a precise specification.//在ISO注册的4个字符。

下表来源于网络,列出了几种常见的基于基础文件格式的,媒体封装格式标识。

更多的内容可以查看http://www.ftyps.com/

  Brand Extension Mime Type
MP4 mp41, mp42 .mp4 video/mp4, audio/mp4, application/mp4
3GPP various, e.g. 3gp4, 3gp5 .3gp video/3gpp, audio/3gpp
3GPP2 3g2a .3g2 video/3gpp2, audio/3gpp2
Motion JPEG 2000 mjp2 .mj2 video/mj2
QuickTime "qt" .mov video/quicktime

结合实际文件,下图是MP4文件起始位置存放的数据

length(4字节):0x0000001c:box的长度是28字节;

boxtype(4字节):0x66747970:“ftyp”的ASCII码,box的标识;

major_brand(4字节):0x69736f6d:“isom“的ASCII码;

minor_version(4字节):0x00000200:ismo的版本号;

compatible_brands(12字节):说明本文件遵从(或称兼容)ismo,iso2,mp41三种协议。

ftyp box通常放在文件的开始,通过对该box解析可以让我们的软件(播放器、demux、解析器)知道应该使用哪种协议对这该文件解析。

************************************

** 元数据moov **

************************************

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

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

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

Fragmented MP4文件格式相关推荐

  1. mp4文件格式之fragment mp4

    目前网络上对mp4文件格式的总结已经相当多了,我就不在这里抄别人总结的东西了,想入门的话百度一下会有许多这方面的文章.这里介绍一下其他文章中很少涉及的一种mp4文件结构,即fragment mp4,也 ...

  2. MOV及MP4文件格式中几个重要的Table

    MP4,全称是MPEG4 Part 14,是一种使用MPEG-4的多媒体文件格式,扩展名为.mp4. MOV,是QuickTime影片格式,它是Apple公司开发的一种音频.视频文件格式,用于存储常用 ...

  3. mp4文件格式解析(一)

    原文地址:mp4文件格式解析(一)作者:可下人间 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准.随后MP4概念被转移到视频上,对应的是MPE ...

  4. 第七季1:MP4文件格式解析

    以下内容源于朱有鹏课程,如有侵权,请告知删除. 本季内容 (1)将编解码得到的视频打包成mp4格式并存储到TF卡 MP4的组织形式和box解析 移植和使用mp4v2开源库来打包MP4 进一步研究MP4 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 数据标注、模型调参debug...通通自动化!华为云AI开发集大成之作ModelArts 2.0发布...
  2. linux 虚拟仪器,linux平台下编写虚拟仪器系统设计
  3. Spring AOP详解(http://sishuok.com/forum/posts/list/281.html)
  4. python使用snappy压缩
  5. python3.7游戏_python3.7+django环境搭建
  6. vue项目没有router文件夹_vueRouter没有报错,但是页面渲染空白
  7. WIFI无线路由器的五种工作模式
  8. c语言如何控制电脑串口,C语言直接驱动硬件实现PC机的串口操作
  9. 一加8/一加8 Pro外形配置全曝光:就差个价格了
  10. 老电脑linux内核,如何删除废旧的Linux内核(kernel)
  11. 基于机器视觉的冲压金属瓶质量检测
  12. 树的先序遍历递归的理解
  13. 【收藏】10个重要问题概览Transformer全部内容
  14. 8天玩转并行开发——第二天 Task的使用
  15. AD 20中文软件安装教程
  16. CSDN免费获得积分和直接获取下载码的方法,亲测有效
  17. 奥迪A8的L3级自动驾驶方案---奥迪A8的zFAS
  18. 解决echarts缩放模糊问题
  19. delphi mysql.pas_Delphi 一些pas
  20. 转自猎豹移动CEO傅盛:深度学习是什么?

热门文章

  1. 职业迷茫,测试危机到了头上,该如何找准自我定位?
  2. idea使用SVN返回历史版本
  3. SQL学习-基础课程
  4. Python open函数详解
  5. Excel如何将同行数据在行内随机排序
  6. 读书笔记--腾讯音乐:全民K歌推荐系统架构及粗排设计
  7. golang坑之 ‘godoc‘ 不是内部或外部命令
  8. ubuntu16.04 安装配置环境
  9. LWN:确定了会计系统!
  10. Hanselman和Diabetes Walk团队2007