华客硬盘数据恢复论坛,华客数据恢复,北京数据恢复论坛,数据恢复培训,RAID服務(wù)器数据恢复论坛,华客400-065-1013

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3628|回复: 3
打印 上一主题 下一主题

MP4文(wén)件格式分(fēn)析及分(fēn)割实现(附源码)

[复制链接]

877

主题

1092

帖子

44万

积分(fēn)

管理(lǐ)员

Rank: 9Rank: 9Rank: 9

积分(fēn)
441500
跳转到指定楼层
楼主
发表于 2018-12-27 20:36:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MP4文(wén)件格式分(fēn)析及分(fēn)割实现(附源码)               MP4文(wén)件格式分(fēn)析                  

  MP4(MPEG-4 Part 14)是一种常见的多(duō)媒體(tǐ)容器格式,它是在“ISO/IEC 14496-14”标准文(wén)件中定义的,属于MPEG-4的一部分(fēn),是“ISO/IEC 14496-12(MPEG-4 Part 12 ISO base media file format)”标准中所定义的媒體(tǐ)格式的一种实现,后者定义了一种通用(yòng)的媒體(tǐ)文(wén)件结构标准。MP4是一种描述较為(wèi)全面的容器格式,被认為(wèi)可(kě)以在其中嵌入任何形式的数据,各种编码的视频、音频等都不在话下,不过我们常见的大部分(fēn)的MP4文(wén)件存放的AVC(H.264)或MPEG-4(Part 2)编码的视频和AAC编码的音频。MP4格式的官方文(wén)件后缀名是“.mp4”,还有(yǒu)其他(tā)的以mp4為(wèi)基础进行的扩展或者是缩水版本的格式,包括:M4V,3GP,F4V等。

  一个mp4文(wén)件有(yǒu)可(kě)能(néng)包含非常多(duō)的box(全部大约70多(duō)个),在很(hěn)大程度上增加了解析的复杂性。如果要全部解析必要性不是很(hěn)大。大部分(fēn)mp4文(wén)件没有(yǒu)那么多(duō)的box类型,下图就是一个简化了的,常见的mp4文(wén)件结构:

下图是节点box详细说明:

下面我们将对以上主要box的解析进行详细说明:

1. 一级box

  一级box主要包含ftyp、moov、free、mdat等等。

1.1 ftyp box

结构:

[url=][/url]
/**********************************************************************************************                            File Type Box (ftyp)**--------------------------------------------------------------------------------------------**        字段名称              |    長(cháng)度(bytes)   |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize               |    4            |        box的長(cháng)度**        boxtype               |    4            |        box的类型**        major_brand           |    4            |**        minor_version         |    4            |        版本号**        compatible_brands     |    4 * N        |        本文(wén)件遵从的多(duō)种协议(ismo, iso2, mp41)********************************************************************************************/[url=][/url]

运行结果:

1.2 moov box

结构:

[url=][/url]
/**********************************************************************************************        字段名称            |    長(cháng)度(bytes)   |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize            |    4            |        box的長(cháng)度**        boxtype            |    4            |        box的类型********************************************************************************************/[url=][/url]

1.3 free box

结构:

[url=][/url]
/**********************************************************************************************        字段名称            |    長(cháng)度(bytes)   |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize            |    4            |        box的長(cháng)度**        boxtype            |    4            |        box的类型********************************************************************************************/[url=][/url]

1.4 mdat box

结构:

[url=][/url]
/**********************************************************************************************        字段名称             |    長(cháng)度(bytes)    |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize             |    4             |        box的長(cháng)度**        boxtype             |    4             |        box的类型**                                               |        后面全是真实数据********************************************************************************************/[url=][/url]

运行结果:

2. 二级box

  本节所说的二级box皆為(wèi)moov的子box,主要包含mvhd、trak、udat等等。

2.1 mvhd box

结构:

[url=][/url]
/**************************************************************************************************************                                            mvhd**--------------------------------------------------------------------------------------------**        字段名称              |    長(cháng)度(bytes)   |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize               |    4            |        box的長(cháng)度**        boxtype               |    4            |        box的类型**        version               |    1            |        box版本,0或1,一般為(wèi)0(以下字节数均按version = 0)**        flags                 |    3            |        **        creation time         |    4            |        创建时间(相对于UTC时间1904 - 01 - 01零点的秒(miǎo)数)**        modification time     |    4            |        修改时间**        time scale            |    4            |        文(wén)件媒體(tǐ)在1秒(miǎo)时间内的刻度值,可(kě)以理(lǐ)解為(wèi)1秒(miǎo)長(cháng)度的时间单元数**        duration              |    4            |        该track的时间長(cháng)度,用(yòng)duration和time scale值可(kě)以计算track时長(cháng)**        rate                  |    4            |        推荐播放速率,高16位和低16位分(fēn)别為(wèi)小(xiǎo)数点整数部分(fēn)和小(xiǎo)数部分(fēn),即[16.16] 格式.该值為(wèi)1.0 (0x00010000)**        volume                |    2            |        与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量**        reserved              |    10           |        保留位**        matrix                |    36           |        视频变换矩阵**        pre-defined           |    24           |        **        next track id         |    4            |        下一个track使用(yòng)的id号************************************************************************************************************/[url=][/url]

运行结果:

2.2 trak box

结构:

[url=][/url]
/**********************************************************************************************        字段名称            |    長(cháng)度(bytes)   |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize            |    4            |        box的長(cháng)度**        boxtype            |    4            |        box的类型********************************************************************************************/[url=][/url]

2.3 udat box

结构:

[url=][/url]
/**************************************************************************************************************           udat**--------------------------------------------------------------------------------------------**  字段名称      | 長(cháng)度(bytes)    |  有(yǒu)关描述--------------------------------------------------------------------------------------------**  boxsize     | 4        |  box的長(cháng)度**  boxtype      | 4        |  box的类型**                          |  用(yòng)户自定义数据解析************************************************************************************************************/[url=][/url]

运行结果:

3. 三级box

  本节所说的三级box皆為(wèi)trak的子box,主要包含tkhd、mdia等。

3.1 tkhd box

结构:

[url=][/url]
/**************************************************************************************************************                                        tkhd**-------------------------------------------------------------------------------------------------------------**        字段名称               |    長(cháng)度(bytes)   |        有(yǒu)关描述-------------------------------------------------------------------------------------------------------------**        boxsize                |    4            |        box的長(cháng)度**        boxtype                |    4            |        box的类型**        version                |    1            |        box版本,0或1,一般為(wèi)0。(以下字节数均按version = 0)**        flags                  |    3            |        按位或操作结果值,预定义如下;                                                         0x000001 track_enabled,否则该track不被播放;                                                         0x000002 track_in_movie,表示该track在播放中被引用(yòng);                                                         0x000004 track_in_preview,表示该track在预览时被引用(yòng)。                                                         一般该值為(wèi)7,如果一个媒體(tǐ)所有(yǒu)track均未设置track_in_movie和track_in_preview,将被理(lǐ)解為(wèi)所有(yǒu)track均设置了这两项;                                                         对于hint track,该值為(wèi)0;**        creation_time          |    4            |        创建时间(相对于UTC时间1904 - 01 - 01零点的秒(miǎo)数)**        modification_time      |    4            |        修改时间**        track_id               |    4            |        id号 不能(néng)重复且不能(néng)為(wèi)0**        reserved               |    4            |        保留位**        duration               |    4            |        track的时间長(cháng)度**        reserved               |    8            |        保留位**        layer                  |    2            |        视频层,默认為(wèi)0,值小(xiǎo)的在上层**        alternate_group        |    2            |        track分(fēn)组信息,默认為(wèi)0表示该track未与其他(tā)track有(yǒu)群组关系**        volume                 |    2            |        [8.8] 格式,如果為(wèi)音频track,1.0(0x0100)表示最大音量;否则為(wèi)0**        reserved               |    2            |        保留位**        matrix                 |    36           |        视频变换矩阵**        width                  |    4            |        宽**        height                 |    4            |        高,均為(wèi)[16.16] 格式值 与sample描述中的实际画面大小(xiǎo)比值,用(yòng)于播放时的展示宽高************************************************************************************************************/[url=][/url]

运行结果:

3.2 mdia box

结构:

[url=][/url]
/**********************************************************************************************        字段名称            |    長(cháng)度(bytes)   |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize            |    4            |        box的長(cháng)度**        boxtype            |    4            |        box的类型********************************************************************************************/[url=][/url]

4. 四级box

  本节所说的四级box皆為(wèi)mdia的子box,主要包含mdhd、hdlr、minf等。

4.1 mdhd box

结构:

[url=][/url]
/**************************************************************************************************************                                        tkhd**-------------------------------------------------------------------------------------------------------------**        字段名称              |      長(cháng)度(bytes)   |        有(yǒu)关描述-------------------------------------------------------------------------------------------------------------**        boxsize               |    4                |        box的長(cháng)度**        boxtype               |    4                |        box的类型**        version               |    1           |        box版本0或1 一般為(wèi)0 (以下字节数均按version=0)**        flags                 |    3                |        **        creation_time         |    4                |        创建时间(相对于UTC时间1904 - 01 - 01零点的秒(miǎo)数)**        modification_time     |    4                |        修改时间**        time_scale            |    4                |        **        duration              |    4               |        track的时间長(cháng)度**        language              |    2               |        媒體(tǐ)语言码,最高位為(wèi)0 后面15位為(wèi)3个字符[见ISO 639-2/T标准中定义]**        pre-defined           |    2                |        保留位************************************************************************************************************/[url=][/url]

结果:

4.2 hdlr box

结构:

[url=][/url]
/**************************************************************************************************************                                        hdlr**-------------------------------------------------------------------------------------------------------------**        字段名称               |    長(cháng)度(bytes)    |        有(yǒu)关描述-------------------------------------------------------------------------------------------------------------**        boxsize                |    4             |        box的長(cháng)度**        boxtype                |    4             |        box的类型**        version                |    1             |        box版本0或1 一般為(wèi)0 (以下字节数均按version=0)**        flags                  |    3             |**        pre-defined            |    4             |**        handler type           |    4             |        在media box中,该值為(wèi)4个字符                                                          "vide"— video track                                                          "soun"— audio track                                                          "hint"— hint track**        reserved               |    12            |**        name                   |    不定           |        track type name,以‘\0’结尾的字符串************************************************************************************************************/[url=][/url]

结果:

4.3 minf box

结构:

[url=][/url]
/**********************************************************************************************        字段名称            |    長(cháng)度(bytes)   |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize            |    4            |        box的長(cháng)度**        boxtype            |    4            |        box的类型********************************************************************************************/[url=][/url]

5. 五级box

  本节所说的五级box皆為(wèi)minf的子box,主要包含header box(vmhd/smhd/hmld/nmld)、stbl等。

5.1 header box

本处的headerbox会根据前面的handler type数值选择哪个box。

"vide"—vmhd 视频

"soun"— smhd 音频

"hint"—hmhd 忽略

vmhd结构:

[url=][/url]
/**************************************************************************************************************                                        vmhd**-------------------------------------------------------------------------------------------------------------**        字段名称            |    長(cháng)度(bytes)    |        有(yǒu)关描述-------------------------------------------------------------------------------------------------------------**        boxsize                |    4            |        box的長(cháng)度**        boxtype                |    4            |        box的类型**        version                |    1            |        box版本0或1 一般為(wèi)0 (以下字节数均按version=0)**        flags                |    3            |**        graphics_mode        |    4            |        视频合成模式,為(wèi)0时拷贝原始图像,否则与opcolor进行合成**        opcolor                |    2 ×3        |        {red,green,blue}************************************************************************************************************/[url=][/url]

结果:

5.2 stbl box

结构:

[url=][/url]
/**********************************************************************************************        字段名称            |    長(cháng)度(bytes)   |        有(yǒu)关描述--------------------------------------------------------------------------------------------**        boxsize            |    4            |        box的長(cháng)度**        boxtype            |    4            |        box的类型********************************************************************************************/[url=][/url]

6. 六级box

  本节所说的六级box皆為(wèi)stbl的子box,主要包含stsd、stts、stsz、stsc、stss、stco等,这些也是mp4文(wén)件设计的精髓所在,主要控制chunk、sample、mdat之间的映射关系。

6.1 stsd box

stsd: Sample Description Box,解析stsd可(kě)获得coding类型、视频宽高、音频samplesize、channelcount这些和解码器有(yǒu)关信息。

6.2 stts box

stts: Decoding Time to Sample Box,时间戳和Sample映射表

上图是一个video trak,说明该视频包含87帧数据,每帧包含512个采样。

总共512*87=44544个采样,和我们前面mdhd box的Duration完全一致。

Duration / TimeScale = 44544 / 12288 = 3.625秒(miǎo) 正是我们的视频播放長(cháng)度。

12288 / 512 = 24 p/s (帧率)。

6.3 stsz box

stsz, stz2: Sample Size Boxes,每个Sample大小(xiǎo)的表

一共87帧 每帧的字节大小(xiǎo)。

6.4 stsc box

stsc: Sample to chunk 的映射表。

前面说了一共87帧数据,放在83个chunk中。1~82个chunk每个里面放1帧,第83个chunk放了5帧。

6.5 stss box

stss: 关键帧索引表。

第1、13、25、37、49、61、73、85.... 这些帧都是关键帧。

每12帧就有(yǒu)一个关键帧, 前面我们计算得知fps是24。由此可(kě)知该视频关键帧间隔為(wèi)0.5秒(miǎo)。

6.6 stco box

'stco','co64': Chunk位置偏移表

一共83个chunk,记录在mdat真实数据中的字节偏移量。


下图為(wèi)第三方MP4文(wén)件解析结果:

MP4文(wén)件格式解析源码:https://github.com/kingsunc/AVFileParse


搞清楚stbl的映射关系后 我们就可(kě)以进行MP4文(wén)件的分(fēn)割实现(也就是所谓的点播拖动)。

MP4分(fēn)割实现源码:https://github.com/kingsunc/AVFileParse/tree/master/Mp4_Segment



分(fēn)享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分(fēn)享分(fēn)享 分(fēn)享淘帖 微信分(fēn)享
回复

使用(yòng)道具 举报

0

主题

2

帖子

108

积分(fēn)

新(xīn)手上路

Rank: 1

积分(fēn)
108
沙发
发表于 2019-1-7 13:20:03 | 只看该作者
看不懂
......
回复

使用(yòng)道具 举报

0

主题

32

帖子

1349

积分(fēn)

中级会员

Rank: 3Rank: 3

积分(fēn)
1349
板凳
发表于 2019-1-13 10:59:11 | 只看该作者
好文(wén)章,值得學(xué)习

1

主题

14

帖子

247

积分(fēn)

华客高级培训

Rank: 8Rank: 8

积分(fēn)
247
地板
发表于 2022-6-2 09:46:07 | 只看该作者
默默的对天书点了个赞
您需要登录后才可(kě)以回帖 登录 | 立即注册

本版积分(fēn)规则

QQ|Archiver|手机版|小(xiǎo)黑屋|华客硬盘数据恢复论坛,华客数据恢复,北京数据恢复论坛,数据恢复培训,RAID服務(wù)器数据恢复论坛,华客400-065-1013 ( 京ICP备09067925号-2

GMT+8, 2024-5-8 19:05 , Processed in 0.182475 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表