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

相关文章

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应