IOS 基础媒体文件格式语法描述和语意(MP4文件格式分析实例)

2024-03-20 23:48

本文主要是介绍IOS 基础媒体文件格式语法描述和语意(MP4文件格式分析实例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基本对象 Box

Boxes start with a header which gives both size and type. 

在最前面Box 包含 size和type,size和type都是占4个字节。


The header permits compact or extended size (32or 64 bits) and compact or extended types (32 bits or full Universal Unique IDentifiers, i.e. UUIDs). 

允许根据需要,将size 简化或者扩展,同样的,对于type 也可以根据需要进行简化或者扩展。

简化,即使用32位的 size 和type. 扩展,即使用64位的size 和type.


The standard boxes all use compact types (32-bit) and most boxes will use the compact (32-bit) size. 

标准的box 使用简化的type,即32位的,大多数box一般也都使用简化的 32位的 size。


Typicallyonly the Media Data Box(es) need the 64-bit size.

但是 Media Data Box 需要使用64位的size.


The size is the entire size of the box, including the size and type header, fields, and all contained boxes.  

size指的是整个Box的大小,包括头部的 size和type 的大小,以及后面的值和所有的包含的其他box .

 
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;
}}

二、扩展对象

扩展对象继承了 Box,并在此基础上增加了 version和 flages.

 
aligned(8) class FullBox(unsigned int(32) boxtype, unsigned int(8) v, bit(24) f) extends Box(boxtype) {
unsigned int(8) version = v;
bit(24) flags = f;
}


三、构建文件对象


1、File Type Box 

 
aligned(8) class FileTypeBoxextends Box(‘ftyp’) {unsigned int(32) major_brand;unsigned int(32) minor_version;unsigned int(32) compatible_brands[]; // to end of the box
}


计算一下FileTypeBox的大小:

size占32位,4个字节;

type占32位,4个字节;

major_brand占32位,4个字节;

minor_version占32位,4个字节;

compatible_brands 每个brand占32位,4个字节;



2、Free Space Box 

 
aligned(8) class FreeSpaceBox extends Box('free') { 
    unsigned int(8) data[];
}

计算一下Free Space Box的大小:

size占32位,4个字节;

type占32位,4个字节;

每个 data 占8位,1个字节;


3、Media Data Box


aligned(8) class MediaDataBox extends Box(‘mdat’) { 

bit(8) data[];

}

计算一下Media Data Box的大小:

size占32位,4个字节;

type占32位,4个字节;

每个 data 占8位,1个字节;







4、 Movie Box 

aligned(8) class MovieBox extends Box(‘moov’){


计算一下Movie Box 的大小:

size占32位,4个字节;

type占32位,4个字节;




5、uuid

以上分析了通过一个mp4文件,分析了mp4文件格式顶级box的大小 size 、类型 type 以及相邻box的定位。



下面说一下,uuid.
根据基本对象 Box 的定义,如果
boxtype==‘uuid’
那么在type后面要包含 16个字节的 扩展类型。
扩展类型之后才是数据。



关于顶级box内部的子box的情况还没有做出说明,在下一篇文章会继续。

<EOF>

这篇关于IOS 基础媒体文件格式语法描述和语意(MP4文件格式分析实例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学