MXF是英文Material eXchange Format(素材交换格式)的缩语。MXF是SMPTE(美国电影与电视工程师学会)组织定义的一种专业音视频媒体文件格式。MXF主要应用于影视行业媒体制作、编辑、发行和存储等环节。SMPTE为其定义的标准包括:SMPTE - 377M、SMPTE - EG41、SMPTE - EG42等,并不断进行更新和完善。它是一个外壳格式 而不是压缩格式, 所以并不能保证每一款MXF文件 都能被任何一种解码器识别。

MXF标准并非一成不变,一直在发展。SMPTE中MXF相关标准已经有几十个文档,并且仍然在补充增加,SMPTE定义的只是MXF框架和一般原则,具体实现由各厂商自行完成,各大厂商自己实现的MXF,往往在新产品中也会发生一些变化。

1.MXF文件基本结构

MXF文件包括三个主体部分:文件头、文件体和文件尾。
文件头提供文件的整体信息,包括用于解码文件中所有视音频数据的解码器列表等。文件体由存储在要素容器中的视音频数据组成,来自不同数据轨(如视频、音频和时码)的要素容器可能交错和分离地存储在文件体中。文件尾用以结束一个MXF文件,包括一些在产生文件头时还不确定的信息,如文件的视音频长度等,文件尾的信息在某些场景中常常被忽略。

MXF文件也可包含一个可选的索引表(Index Table),该索引表可用于将基于采样的索引(如时码)快速换算到对应的要素容器在<spanlang="en-us>">MXF文件中的偏移地址,以实现视音频的快速预览和定位。该索引表可分段存储,可位于基本数据段之前或之后,也可分插到基本数据段中间。

2.MXF底层数据结构

MXF文件的所有数据都采用Key-Length-Value(KLV)进行编码以获得格式的灵活性和可扩展性,KLV编码标准定义在SMPTE 336M中。实际上MXF文件就是若干连续KLV数据包的序列(除了可选的RUN-IN包)。

the key identifies the data, the length specifies the length of the data, and the value is the data itself 
  • Key:16字节的标识符。
  • Length:数据(Value域)长度。BER(basic encoding rules )编码方式,如83 00 00 88。

    它使用可变长的字节来表示非常宽的长度范围,该域总是按MSB(高字节优先)编码,如果第一个字节的bit7为0,那么低7位代表了0~127范围的长度,如果bit7为1,那么低7位代表长度域的字节个数。

  • Value:KLV单元中包含的数据

3.MXF的逻辑结构

MXF文件的逻辑模型是一种基于对象的数据结构,主要由头部元数据中的结构元数据定义。结构元数据主要分为两类,一类是与实践特性有关的结构结构元数据包(Structural Metadata Package),一类是与素材或素材容器的特征参数相关的描述符(Descriptors)。每个结构元数据包有1个或多个轨迹(Track)组成,每个轨迹是一段具有起始时间点、编辑速率的时间线,由一个具有一定持续时间的序列(Squence)组成,每个序列又由1个或多个源片段(SourceClip)组成。包(Package)、轨迹(Track)、序列(Squence)、源片段(SourceClip)通过UUID相互引用。
顶层文件包中的每一个轨迹分别对应内容容器中不同的类型并有相应的描述符描述素材的特征信息,如像素、采样率、画幅比、声道数、比特数等。素材包通常为文件的输出时间线,确定在播放或使用时文件中哪个内容容器中的哪些内容被播放,以及这些内容如何同步。素材包中的源片段通过UUID引用,链接到顶层文件包中的某个轨迹。而素材元素元数据(EssenceContainerData)将顶层文件包和具体的素材容器及相应的索引表相互关联起来。

4.MXF文件分析

我们可以通过 MXFExpressAndMXFDesktop_120 和 MXFInspect工具来帮助我们分析MXF文件,这里以op1A 文件为例。

4.1.首先是文件header分区的partition信息。

4.2.字典,指明了16字节Key到2字节Tag的映射关系

4.3.preface:相当于MXF文件的序言,指明了Source Package 和Material Package的UID(通过ContentStorage包含)

4.4.contentstorage :指明了 SourcePackage(FilePackage)和MaterialPackage以及EssenceContainerData的UID

4.5.EssenceContainerData:将素材容器的BodySID和相应索引表的IndexSID关联起来,并指明了FilePackage的UID

4.5. MaterialPackage:素材包,它里面的SourceClip通过UUID引用到了SourcePackage里的某个Track

链接的SourceTrack

BodyPartition里的Essence

4.6.EssenceDescriptor:描述了SourceTrack里面的Essence的信息

4.7.IndexTab:记录每帧在自己所属的Essence中的偏移

其结构可以简单的用下图来粗略的描述

MXF文件结构浅析的更多相关文章

  1. class文件结构浅析(2)

    欢迎转载,转载需声明出处 ------------------ 请先看上一篇:Class类文件结构浅析 上一篇讲的都是理论.以下我们亲自实践一下. 首先编写一个简单的java类: public cla ...

  2. 《FLASH CC 2015 CANVAS 中文教程》——1、导出canvas动画,文件结构浅析

    注::如果你对 FLASH 这个软件操作不够熟悉,建议你可以先看看FLASH动画之类的书. :FLASH CC 在文中直接简称为CC. :以下所以文章中所说的快捷键 如果你按了不起作用,请检查是否有其 ...

  3. .net core 项目文件结构浅析

    1:launch.json (配置调试用的) 通过vs code创建的项目,都会有这个文件,是启动调试的配置文件: (vscode默认支持nodejs调试) 要调试调试c#代码  需要安装 C# 插件 ...

  4. MXF素材文件交换格式深入研究

    MXF素材文件交换格式深入研究   2012-09-03 | 访问次数:262 | 新闻来源:电科网               [摘要]DCI规定数字电影需采用MXF封装音视频等节目素材内容.为了深 ...

  5. 浅析BMP位图文件结构(含Demo)

    浅析BMP位图文件结构(含Demo) 作者:一点一滴的Beer http://beer.cnblogs.com/   关于BMP位图格式在网上可以找到比较详细的相关文档,有兴趣的可以搜索标题为“BMP ...

  6. 【浅析】IMU代码

    IMU的代码的引自https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/imumargalgo ...

  7. Mybatis配置信息浅析 MyBatis简介(二)

    官方文档入门篇中有明确说明 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的. SqlSessionFactory 的实例可以通过 SqlSessionF ...

  8. Java网络编程和NIO详解8:浅析mmap和Direct Buffer

    Java网络编程与NIO详解8:浅析mmap和Direct Buffer 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NI ...

  9. 宋牧春: Linux设备树文件结构与解析深度分析(1) 【转】

    转自:https://mp.weixin.qq.com/s/OX-aXd5MYlE_YoZ3p32qWA 作者简介 宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot.linux.ucos ...

随机推荐

  1. LeetCode OJ:Symmetric Tree(对称的树)

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  2. winform中DataGridView使用DataGridViewCheckBoxColumn实现RadioBox单选功能

    private void dgvMaterial_CellContentClick(object sender, DataGridViewCellEventArgs e) { ; i < dgv ...

  3. mysql数据库优化。(强力推荐)

    本文转自:https://m.aliyun.com/yunqi/articles/38809 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善 ...

  4. BZOJ - 2588 Spoj 10628. Count on a tree (可持久化线段树+LCA/树链剖分)

    题目链接 第一种方法,dfs序上建可持久化线段树,然后询问的时候把两点之间的所有树链扒出来做差. #include<bits/stdc++.h> using namespace std; ...

  5. BZOJ - 1036 树的统计Count (树链剖分+线段树)

    题目链接 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],mx[ ...

  6. storm 学习教程

    转自:http://blog.csdn.net/hrn1216/article/details/51538962 翻译太累了,再也不想去翻译了,真的太累了: 在这个教程中, 你将学到如何创建一个Sto ...

  7. JavaWeb框架_Struts2_(二)----->Struts2的核心配置

    2.  Struts2的核心配置 2.1  配置Struts.xml文件 2.1.1 Struts.xml文件 Struts2框架的核心配置文件是Struts.xml,该文件主要用来配置Action和 ...

  8. poj 2115 C Looooops——exgcd模板

    题目:http://poj.org/problem?id=2115 exgcd裸题.注意最后各种%b.注意打出正确的exgcd板子.就是别忘了/=g. #include<iostream> ...

  9. gitlab init project

    Command line instructions Git global setup git config --global user.name "zxpo" git config ...

  10. C# 加密和解密文件

    相关示例代码如下: using System; using System.IO; using System.Security; using System.Security.Cryptography; ...