zoukankan      html  css  js  c++  java
  • MP4文件格式

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

    Author:Pirate Leo

    Email:codeevoship@gmail.com

    一、基本概念

    1、 文件,由许多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的结构用伪代码表示如下:

    1. aligned(8) class Box (unsigned int(32) boxtype,optional unsigned int(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.     else if (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.     }   
    aligned(8) class Box (unsigned int(32) boxtype,optional unsigned int(8)[16] extended_type) 
    { 
        unsigned int(32) size; 
        unsigned int(32) type = boxtype; 
        if (size==1) 
        { 
            unsigned int(64) largesize; 
        } 
        else if (size==0) 
        { 
            // box extends to end of file 
        } 
        if (boxtype==‘uuid’) 
        { 
            unsigned int(8)[16] usertype = extended_type; 
        } 

    结构如下图:

     

                                                                                                 文件基本结构描述图

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

    MP4文件概述

    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

    正式开始前先对文件的几个重要部分宏观介绍一下,以便诸位在后续学习时心中有数:

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

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

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

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

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

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

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

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

    文件类型ftyp(ISO-14496-12)

    Author:Pirate Leo

    Email:codeevoship@gmail.com

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

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

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

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

    本次解析ftyp box

    1. aligned(8) class FileTypeBox 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. }  
    aligned(8) class FileTypeBox extends Box(‘ftyp’) 
    { 
        unsigned int(32) major_brand; 
        unsigned int(32) minor_version; 
        unsigned int(32) compatible_brands[];  // to end of the box 
    }

    什么是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、解析器)知道应该使用哪种协议对这该文件解析,是后续解读文件基础。

  • 相关阅读:
    图解zookeeper FastLeader选举算法【转】
    win10 tensorflow python3*,Multiprocessing using fit_generator(pickle_safe=True) fail问题解决
    xcode从8升级到9出现的问题
    c++保存数据到TXT
    基于机器学习人脸识别face recognition具体的算法和原理
    pycharm 操作的一些设置,记录下
    ML-DL-各种资源汇总
    MATLAB实现多元线性回归预测
    【机器学习】 Matlab 2015a 自带机器学习算法汇总
    C++中嵌入python程序——命令行模式
  • 原文地址:https://www.cnblogs.com/qq260250932/p/4282304.html
Copyright © 2011-2022 走看看