ISO/IEC 15444-12 MP4 封装格式标准摘录 5
感谢Google Translate,Microsoft Translate,通篇机翻,不保证绝对正确
Segments
media presentation可能分段传输,比如 HTTP stream。将文件以分段或者连续分段的形式组织起来是可能的,其其不一定是形成符合ISO基础媒体文件格式的文件(比如:它们不包含Movie box)。
Segment Type Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
'styp' | File | No | 0 /more |
如果单个文件存储segments(e.g. 在一个标准http server上),'segment files'中包含 styp box是推荐的,如果出现,必须是第一个,为了分辨这些文件和使声明符合规范。
styp 和 ftyp box 类似。其包含的brands也可能包含在在moov box之前的ftyp box中,也可能包含其他的brands以兼容具有不同格式的segment。
一个有效的styp box应该是segment第一个box。如果segments被链接在一起,styp box可以被删除,但这不是必须的。不是第一个box的styp box可以被忽略。
Segment Index Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
'sidx' | File | No | 0 /more |
‘sidx’为其应用的media segment中的一个媒体流提供紧凑索引。 它的设计使其不仅可以用于基于此规范的媒体格式(即包含sample tables或movie fragments的segment),还可以用于其他媒体格式(比如, MPEG‐2 Transport Streams [ISO/IEC 13818‐1])。出于此原因,本处给出的通用描述,随后给出在使用Movie fragment 时的具体定义。
每个Segment Index box记录了一个(sub)segment 是如何被划分为 一个或多个subsegments(它们还可能使用segment index box继续划分)。
subsegment被定义为一段时间区间内包含的 (sub)segment,并对应于包含的 (sub)segment的字节范围。所有subsegment的duration为包含的 (sub)segment的duration的和。
sidx box中的每个entry都包含一个引用类型,该引用类型指向被引用的lest-segment的媒体信息,或者指向了描述被引用的subsegment如何进一步划分的sidx。结果,通过记录应用于相同( (sub)segment的部分的其他sidx的时间和字节偏移信息,可以以“分层”或“菊花链”(daisy-chain)或其他形式来index the segment。
每个sidx box提供有关segment的单个媒体流的信息,称为参考流。 如果提供,则对于给定媒体流,段中的第一segment中的sidx box应记录段中该媒体流的全部,并且应该在该segment中用于相同媒体流的任何其他sidx box之前。
如果针对至少存在一个媒体流而不是segment中的所有媒体流的segment index,则通常选择不对每个访问单元进行独立编码的媒体流(例如视频)进行index。 对于没有存在segment index的任何媒体流(称为non-indexed stream),与段中的第一sidx box相关联的媒体流用作参考流,在某种意义上其还描述了任何non-indexed媒体流的 subsegment。
sidx box 可能与被索引的media内联在同一个文件中,在某些情况下,也可以内联在仅包含索引信息的单独文件中。
sidx box包含对该box记录了(sub)segment的一系列引用subsegment。 引用的subsegent在呈现时间内是连续的。 类似地,sidx box引用的字节在媒体文件和单独的索引段中始终是连续的,或者如果索引放在媒体文件中,则在单个文件中是连续的。 引用的大小给出了引用的材料(material)中的字节数。
media segment 可能被超过一个互相独立的 "top-level"的sidx box 引用,它们中的任一个都索引了一个具有media stream的media segment。在包含多个媒体流的segment中, 引用的字节可能包含来自多个流的媒体, 即使 sidx box只提供一个媒体流的计时信息。
在包含 sidx box的文件中, sidx box的定位点(anchor)是该box之后的第一个字节。如果有两个文件, 则媒体文件中的定位点是top‐level segment的开头 (即如果每个segment存储在单独的文件中, 则是segment文件的开头)。包含媒体的文件中的材料 (也可能是包含sidx box的文件) 从锚点指示的偏移量开始。如果有两个文件, 索引文件中的material将从定位点开始, 即紧跟在 sidx box之后。
有两个约束条件(a):subsegments在时间上是连续的,也就是说,循环中的每个entry都是紧接着前一个的 (b):在一个给定的文件中,引用byte是连续的,以下一些可能性:
*in its byte count,对sidx box的引用可以包括在记录subsegment的sidx box之后
*在一个完整的文件中,使用first_offset
字段能够从被引用的media中区分出sidx box。
*在一个完整文件中,能够从哪些被索引的meida附近的subsegment定位sidx box。
*当使用包含segment index的单独文件时,循环entry可能是“混合类型”,一些是index segment中的sidx box,一些是媒体文件中的media subsegment。
配置文件可用于限制segment index的放置或index的整体复杂性
aligned(8) class SegmentIndexBox extends FullBox(‘sidx’, version, 0) {
unsigned int(32) reference_ID;
unsigned int(32) timescale;
if (version==0) {
unsigned int(32) earliest_presentation_time;
unsigned int(32) first_offset;
}
else {
unsigned int(64) earliest_presentation_time;
unsigned int(64) first_offset;
}
unsigned int(16) reserved = 0;
unsigned int(16) reference_count; //number of referenced items
for(i=1; i <= reference_count; i++)
{
bit (1) reference_type;
unsigned int(31) referenced_size;
unsigned int(32) subsegment_duration;
bit(1) starts_with_SAP; //whether the referenced subsegments start with a SAP
unsigned int(3) SAP_type; //SAP type as specified in Annex I, or the value 0.
unsigned int(28) SAP_delta_time; //indicates TSAP of the first SAP, in decoding order, in the referenced subsegment for the reference stream
}
}
reference_ID
提供了引用stream的stream ID。如果sidx被“parent”sidx引用,reference_ID
的值应该同引用者sidx box的reference_ID
值一致。
timescale
为此box中的time和duration字段提供每秒刻度的时间刻度; 建议此值匹配参考流或track的时间刻度; 对于基于此规范的文件,即track的Media Header Box的时间刻度字段;
earliest_presentation_time
是timescale字段中指示的timescale中第一subsegment中参考流中任何内容的最早呈现时间; 最早的呈现时间来自访问单元中的媒体或访问单元的部分,edit list(如果有)不会忽略
first_offset
是包含媒体的文件中从锚点到索引材料的第一个字节的距离(以字节为单位)
reference_type
置1表示引用的是一个sidx box。否则则是media content。如果一个单独的index segment被使用,引用类型为1的entry在index segment中,引用类型为0的entry则在media 文件中。
referenced_size
从引用项的第一个字节到下一个引用项的第一个字节的字节距离,或者在最后一个条目的情况下,到引用材料的结尾的距离;
subsegment_duration
当引用是sidx box时,该字段携带该box中subsegment_duration
字段的总和; 当引用是一个subsegment时,该字段携带下一个subsegment(或下一个segment的第一个subsegment,如果这是segment的最后一个subsegment,参见流的任何访问单元)的最早呈现时间之间的差异, 或参考流的结束呈现时间(如果这是流的最后一个subsegment)和参考流的任何访问单元在参考subsegment中的最早呈现时间; duration与earliest_presentation_time
的单位相同;
Subsegment Index Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
'ssix' | File | No | 0 /more |
In other words, this box provides a compact index for how the data in a subsegment is ordered according to levels into partial subsegments. It enables a client to easily access data for partial subsegments by downloading ranges of data in the subsegment
ssix box 提供了从 levels(由Level Assignment box指定)到被索引subsegment的字节范围的映射。换句话说,此box提供了一个紧凑的索引,用于指示subsegment中的数据如何根据级别划分为部分subsegment。 它使客户端能够通过下载subsegment中的区间数据来轻松访问部分subsegment的数据。
subsegment中的每个字节应明确分配给一个级别,因此范围计数必须为2或更大。 如果范围与级别分配中的任何信息都没有关联,则可以使用级别分配中未包括的任何级别。
每个sidx box中应该有0或1个ssix box,它们仅索引 leaf subsegments,即仅索引subsegment但不包含segment index。 ssix(如果有)应为关联的sdix box后面的下一个box。 ssix box记录前一个sidx box中指示的subsegment。
通常,从字节范围构造的媒体数据是不完整的,即它不符合整个subsegment的媒体格式。
aligned(8) class SubsegmentIndexBox extends FullBox(‘ssix’, 0, 0) {
unsigned int(32) subsegment_count;
for( i=1; i <= subsegment_count; i++)
{
unsigned int(32) range_count; //媒体数据分组的部分subsegment级别的数量。 该值应大于或等于2
for ( j=1; j <= range_count; j++) {
unsigned int(8) level; //the level to which this partial subsegment is assigned
unsigned int(24) range_size; //size of the partial subsegment
}
}
}
subsegment_count
是一个正整数,指定在此box中为其指定部分subsegment信息的subsegment数。 subsegment_count
应等于紧接在前的Segment Index box中的reference_count
(即,movie fragment引用的数量)
Producer Reference Time Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
'prft' | File | No | 0 /more |
producer reference time box提供相对挂钟时间,在该时间点生成movie fragments或包含movie fragments的文件。 当这些文件实时生成和使用时,这可以为客户端提供信息,使消费和生产能够以相同的速率进行,从而避免可能的缓冲区溢出或下溢。
此box与按位流顺序跟随它的下一个movie fragment box相关。它必须遵循段中的任何segment type 或 segment index box (如果有), 并出现在下面的movie
fragment box(它所引用的) 之前。如果segment文件包含任何producer reference time boxes, 则第一个文件应出现在该段中的第一个movie fragment box之前。
aligned(8) class ProducerReferenceTimeBox extends FullBox(‘prft’, version, 0) {
unsigned int(32) reference_track_ID; //the track_ID for the reference track
unsigned int(64) ntp_timestamp; //a UTC time in NTP format corresponding to decoding_time.
if (version==0) {
unsigned int(32) media_time;
} else {
unsigned int(64) media_time;
}
}
media_time
对应于与ntp_timestamp
相同的时间, 在用于引用track的时间单位中,并在产生媒体时在该媒体时钟上测量。
Support for Incomplete Tracks
略
Hint Track Formats
略
Sample Groups
略
ISO/IEC 15444-12 MP4 封装格式标准摘录 5的更多相关文章
- ISO/IEC 15444-12 MP4 封装格式标准摘录 4
目录 Movie Fragments Movie Extends Box Movie Extends Header Box Track Extends Box Movie Fragment Box M ...
- ISO/IEC 15444-12 MP4 封装格式标准摘录 3
目录 Track Data Layout Structures Data Information Box Data Reference Box Sample Size Boxes Compact Sa ...
- ISO/IEC 15444-12 MP4 封装格式标准摘录 2
目录 Track Media Structure Media Box Media Header Box Handler Reference Box Media Information Box Medi ...
- mp4封装格式各box类型讲解及IBP帧计算
mp4封装格式各box类型讲解及IBP帧计算 目录 mp4封装格式各box类型讲解及IBP帧计算 box ftyp box moov box mvhd box (Movie Header Box) t ...
- H.264标准(一)mp4封装格式详解
在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...
- ISO/IEC 14496 文档内容简介, MPEG标准
ISO/IEC 14496是MPEG专家组制定的MPEG-4标准于1998年10月公布第1版,1999年1月成为国际标准,1999年12月公布了第2版,2000年初成为国际标准. 全文分为21个部分: ...
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- 多媒体封装格式详解---MP4
MP4文件格式详解——结构概述 http://blog.csdn.net/pirateleo/article/details/7061452 一.基本概念 1. 文件,由许多Box和FullBox组成 ...
- ISO日期格式标准,浏览器到服务器到mysql中的时区
时区简单理解 https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA 上面的链接是时区的wiki说明,下面说说我记住的部分: GMT时区是格林威治标准时间,我 ...
随机推荐
- Linux命令集锦:chown命令
chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者变成文件所属的组. 使用 chown -R liu /usr/wang //将目录/usr ...
- React Native常用的第三方开源库
记录一下自己暂目前了解和使用的一些开源库和官方文档和优秀博客介绍,希望对你有帮助☺️: 1.Toast: https://github.com/magicismight/react-native-ro ...
- Docker在PHP项目开发环境中的应用
http://avnpc.com/pages/build-php-develop-env-by-docker
- java数据结构之CopyOnWriteArrayList和CopyOnWriteArraySet
一.什么是CopyOnWrite CopyOnWrite(写时复制)简称COW,这是一种利用读写分离的思想来实现线程安全的程序设计思路.顾名思义该思想就是在写的时候将原数据复制一份,然后在新的数据中进 ...
- vue自定义过滤器的创建与使用
原文地址 过滤器:生活中有很多例子,净水器 空气净化器 .过滤器的作用:实现数据的筛选.过滤.格式化. vue1.*版本是有内置的过滤器,但是在vue2.*所有的版本都已经没有自带的过滤器了. 1.过 ...
- LeetCode.1170-比较字符串中最小字符的出现频率(Compare Strings by Frequency of the Smallest Char)
这是小川的第412次更新,第444篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第263题(顺位题号是1170).在一个非空字符串s上定义一个函数f(s),该函数计算s中最小字 ...
- Mysql安装后在服务里找不到和服务启动不起来的解决方法
一,在安装完Mysql数据库后,发现在控制面板->管理->服务中找不到Mysql的服务启动 解决方法如下:开启命令行,按照如下步骤即可: 1.进入到mysql的安装包,在bin里执行:my ...
- [计蒜客T2237]魔法_树
魔法 题目大意: 数据范围: 题解: 这个题挺好玩的 可以用反证法,发现所有叶子必须都得选而且所有叶子都选了合法. 故此我们就是要使得,一次操作之后使得叶子的个数最少. 这怎么弄呢? 我们发现,如果一 ...
- 23.安装php和echarts进行结合展示图表
数据展示 http://echarts.baidu.com/index.html 是一个图像展示 可以到官方实例中选择各种图 通过下载例子 新建echartdome.php <!DOCTYPE ...
- tcpdump移植和使用
转载于:http://blog.chinaunix.net/uid-30497107-id-5757540.html?utm_source=tuicool&utm_medium=referra ...