QuickTime文件格式解析(mov、mp4)

2023-11-23 12:50

本文主要是介绍QuickTime文件格式解析(mov、mp4),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:《MP4文件格式的解析,以及MP4文件的分割算法》
   《mov格式解析》
   《MOV及MP4文件格式中几个重要的Table》
   《Mov文件格式分析》
   《QuickTimeFileFormat》
   ISO/IEC_14496-12:ISO base media file format

文章目录

  • 一、简介
  • 二、原子(atom)
    • 1、简单原子
    • 2、QT原子
    • 3、常见的顶层原子类型
  • 三、文件结构解析(MP4)
    • 1、格式框架
    • 2、格式解析
      • 2.1 一级box
        • 2.1.1 ftyp box
        • 2.1.2 moov box
        • 2.1.3 free box
        • 2.1.4 mdat box
      • 2.2 二级box
        • 2.2.1 mvhd box
        • 2.2.2 trak box
        • 2.2.3 udat box
      • 2.3 三级box
        • 2.3.1 tkhd box
        • 2.3.2 mdia box
      • 2.4 四级box
        • 2.4.1 mdhd box
        • 2.4.2 hdlr box
        • 2.4.3 minf box
      • 2.5 五级box
        • 2.5.1 header box
        • 2.5.2 stbl box
      • 2.6 六级box
        • 2.6.1 stsd box
        • 2.6.2 stts box
        • 2.6.3 stsz box
        • 2.6.4 stsc box
        • 2.6.5 stss box
        • 2.6.6 stco/co64 box
        • 2.6.7 ctts box
  • 四、数据分析(MOV)
  • 五、相关资料
    • 1、文档资料
    • 2、分析工具
  • 六、问题解析
    • 1、如何获取总时长
    • 2、如何跳播
    • 3、在没有关键帧列表情况下如何跳播
  • 附录1
  • 附录2: ISO/IEC 14496 MPEG的协议标准
  • 附录3

一、简介

QuickTime是Apple公司开发的一套完整的多媒体平台架构,可以用来进行多种媒体的创建、生产和分发,并为这一过程提供端到端的支持:包括媒体的实时捕捉,以编程的方式合成媒体,导入和导出现有的媒体,还有编辑和制作,压缩,分发,以及用户回放等多个环节。QuickTime文件格式是QuickTime整个架构体系中的一环,非常基础和重要的一环。QuickTime的多媒体架构应用于Mac OS和Windows系统上,而QuickTime文件格式是平台无关的,可以应用于各类系统。常见的采用QuickTime文件格式的扩展名有:mov, qt, mp4, m4v, m4a, m4p, m4b等。

二、原子(atom)

原子atom是QuickTime用来构建等级数据结构的基本容器。新创建的QuickTime原子就像树的根。随后的每个原子都包含在其中并且包含数据和其它原子。如果一个QuickTime原子包含其它原子,就被叫做父原子,包含在其中的原子就叫做叶原子。

1、简单原子

原子包含一个原子头,原子头后面是原子数据。原子头包含原子的尺寸和类型字段,用于表示原子的字节尺寸和类型信息;它还可能包含一个扩展的尺寸字段,该字段以64位整数的形式给出了一个大原子的尺寸。原子结构如图1所示。

图1 原子结构图
图1 原子结构图

2、QT原子

原子的特点是:简单、抽象。QuickTime文件格式中的所有数据及信息都可以用原子和原子之间的嵌套关系来表达。然而,基本原子的缺点是,当应用程序遇到未知的原子类型(atom type)时,将无法确认该原子是否有下一级的子原子,此种情况下,应用程序即使对子原子类型是已知的,也无法进行解析。

QT原子是一种增强了的数据结构,它提供了一种更加通用的存储格式,并且消除了一些在使用简单原子时会出现的不明确的地方。QT原子中,根原子atom type项统一设置为“sean”。QT原子在简单原子的基础上,增加了原子ID和子原子数目。QT原子的结构如下图2所示。

图2 QT原子结构图
图2 QT原子结构图

3、常见的顶层原子类型

  • ‘moov’

  • ‘mdat’

  • ‘free’

  • ‘junk’

  • ‘pnot’

  • ‘skip’

  • ‘wide’

  • ‘pict’

  • ‘ftyp’

  • ‘uuid’ : Used by Sony’s MSNV brand of MP4

三、文件结构解析(MP4)

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

1、格式框架

mp4是由一个个“box”组成的,大box中存放小box,一级嵌套一级来存放媒体信息。box的基本结构是:

在这里插入图片描述
图3 box基本结构图

其中,size指明了整个box所占用的大小,包括header部分。如果box很大(例如存放具体视频数据的mdat box),超过了uint32的最大数值,size就被设置为1,并用接下来的8字节uint64来存放大小(实际上只有“mdat”类型的box才有可能用到large size),如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)

一个mp4文件有可能包含非常多的box,在很大程度上增加了解析的复杂性,这个网页上http://mp4ra.org/atoms.html 记录了一些当前注册过的box类型。看到这么多box,如果要全部支持,一个个解析,怕是头都要爆了。还好,大部分mp4文件没有那么多的box类型,下图就是一个简化了的、常见的mp4文件结构:

在这里插入图片描述
在这里插入图片描述
图4 常见mp4文件结构图

一般来说,解析媒体文件,最关心的部分是视频文件的宽高、时长、码率、编码格式、帧列表、关键帧列表,以及所对应的时间戳和在文件中的位置。这些信息,在mp4中是以特定的算法分开存放在stbl box下属的几个box中的,需要解析stbl下面所有的box来还原媒体信息。下表是对于以上几个重要的box存放信息的说明,更完整的表格可参考MP4BOX.xls文件。
在这里插入图片描述

由此可知,要获取到mp4文件的帧列表,还挺不容易的,需要一层层解析,然后综合stts、stsc、stsz、stss、stco等这几个box的信息,才能还原出帧列表,每一帧的时戳和偏移量。而且,你要照顾可能出现或者可能不出现的那些box。。。可以看的出来,mp4把帧sample进行了分组,也就是chunk,需要间接的通过chunk来描述帧,这样做的理由是可以压缩存储空间,缩小媒体信息所占用的文件大小。这里面,stsc box的解析相对来说比较复杂,它用了一种巧妙的方式来说明sample和chunk的映射关系,后面会详细介绍一下。

首先需要说明的是:

1. box中的字节序为网络字节序,也就是大端字节序(Big-Endian),简单的说,就是一个32位的4字节整数存储方式为高位字节在内存的低端。
2. 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进行描述。

2、格式解析

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

2.1 一级box

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

2.1.1 ftyp box

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

/********************************************************************************************
**                            File Type Box (ftyp)
**
--------------------------------------------------------------------------------------------
**        字段名称              |    长度(bytes)   |        有关描述
--------------------------------------------------------------------------------------------
**        boxsize                |    4             |        box的长度
**        boxtype                |    4             |        box的类型
**        major_brand            |    4             |
**        minor_version          |    4             |        版本号
**        compatible_brands      |    4 * N         |        本文件遵从的多种协议(ismo, iso2, mp41)
********************************************************************************************/

运行结果:
在这里插入图片描述

2.1.2 moov box

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

结构:

/********************************************************************************************
**        字段名称            |    长度(bytes)   |        有关描述
--------------------------------------------------------------------------------------------
**        boxsize            |    4             |        box的长度
**        boxtype            |    4             |        box的类型
*************************************************

这篇关于QuickTime文件格式解析(mov、mp4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418076

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI