ISO/IEC 15444-12 MP4 封装格式标准摘录 3
Posted gardenofhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ISO/IEC 15444-12 MP4 封装格式标准摘录 3相关的知识,希望对你有一定的参考价值。
目录
感谢Google Translate,Microsoft Translate,通篇机翻,不保证绝对正确
Track Data Layout Structures
Data Information Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘dinf‘ | ‘minf‘ 或‘meta‘ | Yes(In ‘minf‘) No(optional ‘meta‘) | 1 |
包含声明track中media信息位置的对象。
aligned(8) class DataInformationBox extends Box(‘dinf’) {
}
Data Reference Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘dref‘ | ‘dinf‘ | Yes | 1 |
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘url‘ ‘urn‘ | ‘dref‘ | Yes(至少一个‘url‘或‘urn‘ 出现) | 1 或更多 |
数据引用对象包含一个数据引用表(通常是URL),用于声明表示中使用的media数据的位置。 示例说明中的数据引用索引将此表中的entry与track中的示例联系起来。 以这种方式可以将track分成多个源。
如果设置了标志,指示数据与此box在同一文件中,则在输入字段中不应提供任何字符串(甚至不是空字符串)。
DataReferenceBox中的entry_count应为1或更大; DataReferenceBox中的每个DataEntryBox都应该是DataEntryUrnBox或DataEntryUrlBox。
当具有标志设置的数据entry表明media数据在同一文件中的文件被分割成用于传输的segments时,该标志的值不会改变,因为在传输操作之后(逻辑上)重新组装文件。
aligned(8) class DataEntryUrlBox (bit(24) flags) extends FullBox(‘url ’, version = 0, flags) {
string location;
}
aligned(8) class DataEntryUrnBox (bit(24) flags) extends FullBox(‘urn ’, version = 0, flags) {
string name;
string location;
}
aligned(8) class DataReferenceBox extends FullBox(‘dref’, version = 0, 0) {
unsigned int(32) entry_count;
for (i=1; i <= entry_count; i++) {
DataEntryBox(entry_version, entry_flags) data_entry; //a URL or URN entry.
}
}
data_entry是URL或URN条目。 Name是URN,在URN条目中是必需的。 位置是一个URL,在URL条目中是必需的,在URN条目中是可选的,它提供了一个位置来查找具有给定名称的资源。 每个都是使用UTF-8字符的以null结尾的字符串。 如果设置了自包含标志,则使用URL表单并且不存在字符串; 该框终止于entry-flags字段。 URL类型应该是提供文件的服务(例如,类型为file,http,ftp等的URL),并且理想情况下哪些服务也允许随机访问。 相对URL是允许的,并且相对于包含包含此数据引用的Movie Box的文件。
Sample Size Boxes
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘stsz‘ ‘stz2‘ | ‘stbl‘ | Yes | Exactly one variant must be present |
此box包含sample 数量,和一张表,含有每个sample的size(in bytes)。这允许media数据本身被解构。media中的sample总数始终显示在sample计数中。
sample size box有两个变体。第一个变体具有用于表示sample大小的固定大小32‐bit 字段;它允许为track中的所有样本定义常量大小。第二个变体允许较小的字段, 以便在大小不同但较小时节省空间。这些盒子中的一个必须存在;第一个版本是首选的,具有最大兼容性。
aligned(8) class SampleSizeBox extends FullBox(‘stsz’, version = 0, 0) {
unsigned int(32) sample_size; //为0,代表samples具有不同的size,具体值存储在sample size table。为其他,所有的sample具有相同的size,就是这个值,no array follows
unsigned int(32) sample_count;
if (sample_size==0) {
for (i=1; i <= sample_count; i++) {
unsigned int(32) entry_size; //size of a sample
}
}
}
Compact Sample Size Box
aligned(8) class CompactSampleSizeBox extends FullBox(‘stz2’, version = 0, 0) {
unsigned int(24) reserved = 0;
unisgned int(8) field_size; //size in bits of the entries in the following table
unsigned int(32) sample_count; //gives the number of entries in the following table
for (i=1; i <= sample_count; i++) {
unsigned int(field_size) entry_size; //size of a sample, indexed by its number.
}
}
Sample To Chunk Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘stsc‘ | ‘stbl‘ | Yes | 1 |
media数据中的示例被分组为多个chunks。chunks 可以有不同的大小, 并且chunk中的sample数量可以有不同的大小。此表可用于查找包含sample的chunk、其位置和关联的sample description。
此表紧凑编码。每个entry给出接连具有相同特征的一组chunks的第一个chunk的index。通过从前一个entry中减去一个entry,可以计算在此组中有多少chunks。您可以通过乘以适当的每个chunk的sample数目将其转换为sample计数。
aligned(8) class SampleToChunkBox extends FullBox(‘stsc’, version = 0, 0) {
unsigned int(32) entry_count; //gives the number of entries in the following table
for (i=1; i <= entry_count; i++) {
unsigned int(32) first_chunk;
unsigned int(32) samples_per_chunk; //the number of samples in each of these chunks
unsigned int(32) sample_description_index; //the index of the sample entry that describes the samples in this chunk , range : 1~ the number of sample entries in
the Sample Description Box
}
first_chunk
给出了它给出了这组chunks的第一个chunk的索引,它们共享相同的samples-per-chunk和sample-description-index;track中第一个chunk的索引值为1(此box的第一个记录中的first_chunk字段的值为1,表示第一个样本映射到第一个块)。
Chunk Offset Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘stco’, ‘co64’ | ‘stbl‘ | Yes | Exactly one variant must be present |
chunk offset table将每个chunk的索引提供给包含文件。 有两种变体,允许使用32位或64位偏移。 后者在管理非常大的presentation时非常有用。 这些变体中的至多一个将出现在sample table的任何单个sample中。
偏移是文件偏移,而不是文件中任何box(例如Media Data Box)的偏移。 这允许在没有任何box结构的文件中引用media data。 这也意味着在构造一个自包含的ISO文件时必须小心,因为Movie Box的大小会影响媒体数据的chunk偏移。
aligned(8) class ChunkOffsetBox extends FullBox(‘stco’, version = 0, 0) {
unsigned int(32) entry_count; //number of entries in the following table
for (i=1; i <= entry_count; i++) {
unsigned int(32) chunk_offset; //gives the offset of the start of a chunk into its
containing media file.
}
}
aligned(8) class ChunkLargeOffsetBox extends FullBox(‘co64’, version = 0, 0) {
unsigned int(32) entry_count;
for (i=1; i <= entry_count; i++) {
unsigned int(64) chunk_offset;
}
}
Padding Bits Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘padb’ | ‘stbl‘ | No | 0 / 1 |
在某些流中,media sample不占用sample size给出的所有字节位,并在末尾填充到字节边界。 在某些情况下,有必要额外记录使用的填充位数。 该表提供了该信息。
aligned(8) class PaddingBitsBox extends FullBox(‘padb’, version = 0, 0) {
unsigned int(32) sample_count; //number of samples in the track
int i;
for (i=0; i < ((sample_count + 1)/2); i++) {
bit(1) reserved = 0;
bit(3) pad1; //a value from 0 to 7, indicating the number of bits at the end of sample (i*2)+1.
bit(1) reserved = 0;
bit(3) pad2; //a value from 0 to 7, indicating the number of bits at the end of sample (i*2)+2
}
}
Sub-Sample Information Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘subs’ | ‘stbl‘ ‘traf‘ | No | 0 / more |
此box为了包含sub-sample 信息。
一个sub-sample是一个sample的一段连续字节范围。 应为给定的编码系统提供sub-sample的具体定义(例如,对于ISO / IEC 14496-10,高级视频编码)。 在没有这种特定定义的情况下,该box不适用于使用该编码系统的samples。
如果任何sample的subsample_count
为0,那么这些sample没有sub-sample信息,后面没有数组。table是稀疏编码的。该表通过记录每个entry之间的sample数差异来识别哪些sample 具有sub-sample结构。 表格中的第一个entry记录了具有sub-sample信息的第一个sample的sample编号。
如果同一container box中存在多个Sub-Sample Information Box,则每个Sub-Sample Information Box中的flag
应不同。 应为给定的编码系统提供falg
的语义(如果有的话)。 如果falg
对于给定的编码系统没有语义,则flag
应为0。
aligned(8) class SubSampleInformationBox extends FullBox(‘subs’, version, flags) {
unsigned int(32) entry_count; //gives the number of entries in the following table
int i,j;
for (i=0; i < entry_count; i++) {
unsigned int(32) sample_delta;
unsigned int(16) subsample_count; //number of sub‐sample for the current sample . 0 means no sub-sample structure
if (subsample_count > 0) {
for (j=0; j < subsample_count; j++) {
if(version == 1){
unsigned int(32) subsample_size; //the size, in bytes, of the current sub‐sample.
}
else{
unsigned int(16) subsample_size;
}
unsigned int(8) subsample_priority; //the degradation priority for each sub‐sample.
unsigned int(8) discardable;
unsigned int(32) codec_specific_parameters; //is defined by the codec in use. If no such definition is available,
this field shall be set to 0
}
}
}
}
sample_delta
用于指定具有sub-sample结构的sample数。它被编码为所需的sample编号与上一项中指示的sample编号之间的差异。如果当前entry是第一个entry, the value indicates the sample number of the first sample having sub‐sample information, 即该值是sample数与零 (0) 之间的差异。
discardable
= 0意味着sub-sample需要解码当前sample。= 1则不需要,但增强,例如,sub-sample由补充增强信息(SEI)消息组成。
Sample Auxiliary Information Sizes Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘saiz’ | ‘stbl‘ ‘traf‘ | No | 0 / more |
每个sample辅助信息可以存储在与sample数据本身相同的文件中的任何位置; 对于自包含media data,这通常位于Media Data box或派生规范的box中。 它存储在(a)多个chrunk中,每个chrunk的sample数量,以及chrunk的数量,匹配主要sample数据的分chrunk,或者(b)在单个chrunk中用于电影中的所有sample sample表(或movie fragment)。 单个chrunk(或track run)中包含的所有sample的sample辅助信息是连续存储的(类似于sample数据)。
Sample Auxiliary Information(如果存在)始终存储在与其相关的样本相同的文件中,因为它们共享相同的数据引用(‘dref‘)结构。 但是,此数据可能位于此文件中的任何位置,使用辅助信息偏移(‘saio‘)来指示数据的位置。
是否允许或要求样本辅助信息可以由品牌或使用的编码格式指定。 样本辅助信息的格式由aux_info_type确定。 如果省略aux_info_type和aux_info_type_parameter,则aux_info_type的隐含值是(a)在转换内容的情况下,例如受保护内容,scheme_type
包括在Protection Scheme Information box中或者否则(b)sample entry类型。 aux_info_type_parameter
的默认值为0.可以限制aux_info_type
的某些值仅用于特定track类型。 track可以具有多个不同类型的样本辅助信息流。 这些类型在注册机构注册。
虽然aux_info_type
确定辅助信息的格式,但是当aux_info_type_parameter
的值不同时,可以使用具有相同格式的若干辅助信息流。 必须指定特定aux_info_type
值的aux_info_type_parameter
的语义,同时指定特定aux_info_type
值和隐含辅助信息格式的语义。
此box提供每个sample的辅助信息的大小。 对于此box的每个实例,必须存在匹配的SampleAuxiliaryInformationOffsetsBox,其具有相同的aux_info_type
和aux_info_type_parameter
值,为此辅助信息提供偏移信息。
aligned(8) class SampleAuxiliaryInformationSizesBox extends FullBox(‘saiz’, version = 0, flags)
{
if (flags & 1) {
unsigned int(32) aux_info_type; //identifies the type of the sample auxiliary information
unsigned int(32) aux_info_type_parameter; //identifies the “stream” of auxiliary information having the same value of `aux_info_type` and associated to the same track.
}
unsigned int(8) default_sample_info_size;
unsigned int(32) sample_count; //gives the number of samples for which a size is defined
if (default_sample_info_size == 0) {
unsigned int(8) sample_info_size[ sample_count ]; //the size of the sample auxiliary information in bytes
}
}
Sample Auxiliary Information Offsets Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
‘saio’ | ‘stbl‘ ‘traf‘ | No | 0 / more |
此box以类似于sample数据的chunk偏移的方式提供sample辅助信息的位置信息。
aligned(8) class SampleAuxiliaryInformationOffsetsBox extends FullBox(‘saio’, version, flags)
{
if (flags & 1) {
unsigned int(32) aux_info_type;
unsigned int(32) aux_info_type_parameter;
}
unsigned int(32) entry_count; //the number of entries in the following table.
if ( version == 0 ) {
unsigned int(32) offset[ entry_count ]; //gives the position in the file of the Sample Auxiliary Information for each Chunk or Track Fragment Run.
}
else {
unsigned int(64) offset[ entry_count ];
}
}
以上是关于ISO/IEC 15444-12 MP4 封装格式标准摘录 3的主要内容,如果未能解决你的问题,请参考以下文章