感谢Google Translate,Microsoft Translate,通篇机翻,不保证绝对正确
Movie Fragments
Movie Extends Box
类型 |
容器 |
强制性 |
数量 |
'mvex' |
'moov' |
No |
0 /1 |
此box警告读者, 此文件中可能存在Movie Fragment Boxes。要了解track中的所有samples, 必须按顺序查找和扫描这些Movie Fragment Boxes, 并在逻辑上将其信息添加到 Movie Box 中的信息中。 |
|
|
|
aligned(8) class MovieExtendsBox extends Box(‘mvex’){
}
类型 |
容器 |
强制性 |
数量 |
'mehd' |
'mevx' |
No |
0 /1 |
此box可选,提供了全局duration,包含fragmented movie了fragments,包含了fragments。如果此box没有出现,全局duration必须从每个fragment计算得出。 |
|
|
|
aligned(8) class MovieExtendsHeaderBox extends FullBox(‘mehd’, version, 0) {
if (version==1) {
unsigned int(64) fragment_duration; //declares length of the presentation of the whole movie
including fragments
} else { // version==0
unsigned int(32) fragment_duration;
}
}
fragment_duration
是一个整数,它声明包括fregment的Movie的presentation长度(in the timescale indicated in the Movie Header Box)。 该字段的值对应于最长track的duration,包括Movie fragment。 如果实时创建MP4文件,例如在实时流中使用,则不可能事先知道fragment_duration
,并且可以省略该box。
Track Extends Box
类型 |
容器 |
强制性 |
数量 |
'trex' |
'mevx' |
No |
1 each track in the Movie Box |
设置movie fragments使用的默认值,通过以这种方式设置默认值,可以在每个轨道片段框中保存空间和复杂性。样本片段中的样本标志字段(这里和Fragment Header Box的default_sample_flags , Track Fragment Run Box中的sample_flags 和first_sample_flags )被编码为32位值。其具有以下结构: |
|
|
|
bit(4) reserved=0;
unsigned int(2) is_leading;
unsigned int(2) sample_depends_on;
unsigned int(2) sample_is_depended_on;
unsigned int(2) sample_has_redundancy;
bit(3) sample_padding_value;
bit(1) sample_is_non_sync_sample;
unsigned int(16) sample_degradation_priority;
is_leading
, sample_depends_on
, sample_is_depended_on
和sample_has_redundancy
的值取决于Independent and Disposable Samples Box中文档说明。
sample_is_non_sync_sample
标志提供’stss’
相同的信息。当sample的此值设置为0时,它与样本不在movie fragment中并在sync sample table中用entry标记的情况相同。
sample_padding_value
定义为填充位表。 sample_degradation_priority
定义为降级优先级表。
aligned(8) class TrackExtendsBox extends FullBox('trex', 0, 0){
unsigned int(32) track_ID;
unsigned int(32) default_sample_description_index;
unsigned int(32) default_sample_duration;
unsigned int(32) default_sample_size;
unsigned int(32) default_sample_flags;
}
Movie Fragment Box
类型 |
容器 |
强制性 |
数量 |
'moof' |
File |
No |
0 / more |
moof 提供的信息可能在movie box中已经提供,与往常一样, 如果位于同一文件中,实际的samples 在 Media Data Boxes中。数据引用索引位于sample description中, 因此可以生成增量 presentations, 其中媒体数据位于包含Movie Box的文件之外的文件中。 |
|
|
|
The Movie Fragment Box is a top‐level box。其包含一个 Movie Fragment Header Box, 随后是一个或者多个 Track Fragment Boxes。 |
|
|
|
aligned(8) class MovieFragmentBox extends Box('moof'){
}
类型 |
容器 |
强制性 |
数量 |
'mfhd' |
'moof' |
Yes |
1 |
movie fragment header包含一个序列号,作为安全检查。此序号一般从1开始,每遇到一个movie fragment增加。这允许读者在可能发生意外 re‐ordering 的环境中验证序列的完整性。 |
|
|
|
aligned(8) class MovieFragmentHeaderBox extends FullBox('mfhd', 0, 0){
unsigned int(32) sequence_number;
}
Track Fragment Box
类型 |
容器 |
强制性 |
数量 |
'traf' |
'moof' |
No |
0 / more |
在一个fragment moive 有一组track fragments,每个track有0个或多个(track fragment box)。track fragments 依次包含零个或多个track runs, 每个track runs都记录了该track连续的一组samples。在这些结构中, 许多字段是可选的, 并且可以是默认的。 |
|
|
|
可以使用这些结构向track添加“empty time”,以及添加sample。 例如,empty insert 可用于进行静音抑制的音轨(audio track)中。 |
|
|
|
aligned(8) class TrackFragmentBox extends Box('traf'){
}
类型 |
容器 |
强制性 |
数量 |
'tfhd' |
'traf' |
Yes |
1 |
每个moive fragment 可以添加一个或者多个fragment到每个track。每个track fragment能添加0个或者多个contiguous runs of samples(前边都译为 连续的一组sample)。track fragment header 设置信息和用于runs of samples的默认项。 |
|
|
|
如果显式提供,base‐data‐offset 是与Chunk Offset Box中的chunk offset相同的数据偏移量,即相对于整个完整文件的偏移量 (例如, 从 ftyp box和moive box开始)。在不存在完整文件或其大小未知的情况下, 可能无法使用显式 base‐data‐offset;然后, 需要建立相对于movie fragment的偏移量。 |
|
|
|
aligned(8) class TrackFragmentHeaderBox extends FullBox(‘tfhd’, 0, tf_flags){
unsigned int(32) track_ID;
// all the following are optional fields
unsigned int(64) base_data_offset;
unsigned int(32) sample_description_index;
unsigned int(32) default_sample_duration;
unsigned int(32) default_sample_size;
unsigned int(32) default_sample_flags
}
ft_flags
定义如下:
0x000001 base‐data‐offset‐present: 表示 base‐data‐offset。其为每个track run的数据偏移(data offse)中提供了 一个清晰的锚点。如果此项没有提供或者default‐base‐is‐moof标志没有设置,在movie fragment 中的第一个track 的base‐data‐offset 是Movie Fragment Box的第一个byte的位置,对于第二个和接下来的track fragments,默认项是由前一个fragment的数据的结尾。Fragments 以这种必须都使用相同的数据引用的方式“继承”它们的偏移量。(也就是,这些track的数据必须在同一个文件中。)
0x000002 sample‐description‐index‐present: 默认在Track Extends Box中设置。此处则是对其覆盖。
0x000008 default‐sample‐duration‐present
0x000010 default‐sample‐size‐present
0x000020 default‐sample‐flags‐present
0x010000 duration‐is‐empty: 表示duration 为0,无论是 default-sample duration或者是 Track Extends Box的 default-sample。也就是说,这个时间片中没有sample。在面两种情况同时存在时,在Moive Box中有 edit lists,且有empty-duration fragments,此时 make a presentation是错误的。
0x020000 default‐base‐is‐moof: 若果 base‐data‐offset‐present 是 1, 此标志忽略。如果 base‐dataoffset‐present 为 0 ,则意味着此track fragment 的 base‐data‐offset 是 enclosing Movie Fragment Box的第一个byte的位置。假设 default‐base‐is-moof 在 ‘iso5’ brand 是需要的,其不能在早于iso5之前的brands或者兼容brands中使用。
NOTE 使用default-base-is-moof标志会破坏与早期品牌文件格式的兼容性,因为它为偏移计算设置的锚点与以前不同。因此,当“ftyp” box 中包含早期品牌时,无法设置default-base-is-moof标志。
Track Fragment Run Box
类型 |
容器 |
强制性 |
数量 |
'trun' |
'traf' |
No |
0 / more |
在Track Fragment Box中,有零或多个Track Run Box。如果duration‐is‐empty标志在tf_flags 中设置,就没有track runs。一个track run 记录了一个track的samples的连续集合。 |
|
|
|
aligned(8) class TrackRunBox extends FullBox(‘trun’, version, tr_flags) {
unsigned int(32) sample_count;
// the following are optional fields
signed int(32) data_offset;
unsigned int(32) first_sample_flags;
// all fields in the following array are optional
{
unsigned int(32) sample_duration;
unsigned int(32) sample_size;
unsigned int(32) sample_flags
if (version == 0)
{ unsigned int(32) sample_composition_time_offset; }
else
{ signed int(32) sample_composition_time_offset; }
}[ sample_count ]
}
可选字段的数量取决于标志的下一个字节中设置的位数, 以及标记第二字节中设置的位的记录大小。应遵循此过程, 以允许定义新字段。
如果data-offset没有给出,那么这个run的data会紧跟着上一个run的data,或者从track fragment header定义的base-data-offset(此run是一个track fragment的第一个run),其和track fragment header的base-data-offset相关。
tr_flags
设置如下:
0x000001 data‐offset‐present.
0x000004 first‐sample‐flags‐present;其覆盖了第一个sample的默认值。这使得可以记录一组帧,其中第一个是键,其余是差异帧,而不为每个样本提供显式标志。 如果使用此标志和字段,则不应存在sample flags。
0x000100 sample‐duration‐present: 表明每个sample有其自己的 duration,否则使用默认值。
0x000200 sample‐size‐present: 表明每个sample有其自己的size, 否则使用默认值。
0x000400 sample‐flags‐present; 表明每个sample有其自己的 flags, 否则使用默认值。
0x000800 sample‐composition‐time‐offsets‐present; 表明每个sample有其自己的composition time offset (e.g. as used for I/P/B video in MPEG).
在 composition time-to-sample box 和 track run box 中的 composition offset的值可能是有符号或者无符号的。在composition time-to-sample box中给出的有关有符号composition 偏移量也建议使用。
Movie Fragment Random Access Box
类型 |
容器 |
强制性 |
数量 |
'mfra' |
File |
No |
0 / more |
Movie Fragment Random Access Box('mfra')提供了一个table,可以帮助reader使用电影片段在文件中查找sync sample。它包含一个 track fragment random access box, 用于提供信息的track (可能不是所有track)。它通常被放置在文件的末尾或接近文件的末尾;'mfra' 中的最后一个box提供了 'mfra' 中长度字段的副本。reader可能会尝试通过检查文件的最后32位找到此box, 或者从文件末尾反向扫描搜索'mfra'并使用其中的size信息,看看是否能够定位'mfra'。 |
|
|
|
此box仅提供sync sample所在位置的提示; movie fragments本身是决定性的。 建议读者在定位和使用此box时注意,在创建文件后对文件进行修改可能会导致指针或the declaration of sync samples声明不正确。 |
|
|
|
aligned(8) class MovieFragmentRandomAccessBox
extends Box(‘mfra’)
{
}
Track Fragment Random Access Box
类型 |
容器 |
强制性 |
数量 |
'tfra' |
'mfra' |
No |
0 / more |
每个entry都包含sync sample的位置和显示时间。 请注意,并非需要在表中列出track中的每个sync sample。 |
|
|
|
缺少本box并不意味着所有的sample都是sync sample。无论是否存在box,‘trun’, ‘traf’ 和 ‘trex’中的随机访问信息都应该合理设置。 |
|
|
|
aligned(8) class TrackFragmentRandomAccessBox extends FullBox(‘tfra’, version, 0) {
unsigned int(32) track_ID;
const unsigned int(26) reserved = 0;
unsigned int(2) length_size_of_traf_num; //the length in byte of the traf_number field minus one
unsigned int(2) length_size_of_trun_num; //the length in byte of the trun_number field minus one
unsigned int(2) length_size_of_sample_num; //the length in byte of the sample_number field minus one
unsigned int(32) number_of_entry; //the number of the entries for this track. 若为0,所有sample 都是 sync sample
for(i=1; i <= number_of_entry; i++){
if(version==1){
unsigned int(64) time; //the presentation time of the sync sample in units defined in the ‘mdhd’ of the associated track.
unsigned int(64) moof_offset; //the offset of the ‘moof’ used in this entry
}else{
unsigned int(32) time;
unsigned int(32) moof_offset;
}
unsigned int((length_size_of_traf_num+1) * 8) traf_number; //the ‘traf’ number that contains the sync sample
unsigned int((length_size_of_trun_num+1) * 8) trun_number; //the ‘trun’ number that contains the sync sample
unsigned int((length_size_of_sample_num+1) * 8) sample_number; //the sample number of the sync sample
}
}
Movie Fragment Random Access Offset Box
类型 |
容器 |
强制性 |
数量 |
'mfro' |
'mfra' |
Yes |
1 |
'mfro' box 提供了Movie Fragment Random Access Box('mfra')length 字段的副本。其被放在'mfra'box的最后,因此size 字段也是所在 Movie Fragment Random Access Box 的最后一个。当'mfra'box位于file最后时,很容易定位。此处的size字段必须正确。 但是,'mfra' box 的存在及其在文件中的最后位置都不到保证。 |
|
|
|
aligned(8) class MovieFragmentRandomAccessOffsetBox extends FullBox(‘mfro’, version, 0) {
unsigned int(32) size; //the number of bytes of the enclosing ‘mfra’ box.
}
Track fragment decode time
类型 |
容器 |
强制性 |
数量 |
'tfdt' |
'traf' |
No |
0 /1 |
按照media时间线,Track Fragment Base Media Decode Time Box提供了在Track fragment中按照解码顺序的第一个sample给出了绝对解码时间。这可能很有用, 例如, 在文件中执行随机访问时;不需要对以前fragment中所有samples的sample duration进行求和, 即可找到此值 (其中, sample durations是 Decoding Time to Sample Box 中的增量, 而sample_durations则在preceding track runs)。 |
|
|
|
Track Fragment Base Media Decode Time Box如果出现,应该放在 Track Fragment Header Box后,第一个Track Fragment Run box之前。 |
|
|
|
如果在'tfdt' box 中表示的时间超过前一个movie和movie fragment中的sample duration之和,则延长该track fragment之前的最后一个sample的持续时间,使得总和 现在等于此box中给出的时间。 以这种方式,当下一个sample的时间尚未知道时,可以生成包含sample的fragment。 |
|
|
|
特别地,可以使用empty track fragment(没有sample,但具有'tfdt' box)来建立最后一个sample的duration。 |
|
|
|
aligned(8) class TrackFragmentBaseMediaDecodeTimeBox
extends FullBox(‘tfdt’, version, 0) {
if (version==1) {
unsigned int(64) baseMediaDecodeTime;
} else { // version==0
unsigned int(32) baseMediaDecodeTime;
}
}
baseMediaDecodeTime
是一个整数,等于媒体中所有早前sample解码duration之和(in the media's timescale)。 它不包括添加到所在track fragment 的samples。
Level Assignment Box
类型 |
容器 |
强制性 |
数量 |
'leva' |
'mvex' |
No |
0 /1 |
规定文件子集。映射到级别n的sample可以取决于级别m的任何sample,其中m <= n,并且不应该取决于级别p的任何sample,其中p> n。 例如,可以根据时间级别(例如,SVC或MVC的temporal_id)来指定级别。 |
|
|
|
aligned(8) class LevelAssignmentBox extends FullBox(‘leva’, 0, 0)
{
unsigned int(8) level_count;
for (j=1; j <= level_count; j++) {
unsigned int(32) track_id;
unsigned int(1) padding_flag;
unsigned int(7) assignment_type;
if (assignment_type == 0) {
unsigned int(32) grouping_type;
}
else if (assignment_type == 1) {
unsigned int(32) grouping_type;
unsigned int(32) grouping_type_parameter;
}
else if (assignment_type == 2) {} // no further syntax elements needed
else if (assignment_type == 3) {} // no further syntax elements needed
else if (assignment_type == 4) {
unsigned int(32) sub_track_id;
}
// other assignment_type values are reserved
}
}
Track Extension Properties Box
类型 |
容器 |
强制性 |
数量 |
'trep' |
'mvex' |
No |
0 /more(Zero or one per track) |
此box可用于记录或汇总后续movie fragment中track的特征。 它可能包含任意数量的子box。 |
|
|
|
class TrackExtensionPropertiesBox extends FullBox(‘trep’, 0, 0) {
unsigned int(32) track_id;
// Any number of boxes may follow
}
Alternative Startup Sequence Properties Box
类型 |
容器 |
强制性 |
数量 |
'assp' |
'trep' |
No |
0 /1 |
此box指示在包含Track Extension Properties box中指示的track的后续track fragment中的alternative startup sequence sample groups的属性。 |
|
|
|
class AlternativeStartupSequencePropertiesBox extends FullBox(‘assp’, version, 0){
if (version == 0) {
signed int(32) min_initial_alt_startup_offset;
}
else if (version == 1) {
unsigned int(32) num_entries;
for (j=1; j <= num_entries; j++) {
unsigned int(32) grouping_type_parameter;
signed int(32) min_initial_alt_startup_offset;
}
}
}
Sample Group Structures
略(Ref:ISO/IEC 15444-12 Chapter 8.9)
User Data
略(Ref:ISO/IEC 15444-12 Chapter 8.10)
略(Ref:ISO/IEC 15444-12 Chapter 8.11)
Support for Protected Streams
略(Ref:ISO/IEC 15444-12 Chapter 8.12)
略(Ref:ISO/IEC 15444-12 Chapter 8.13)
Sub tracks
略(Ref:ISO/IEC 15444-12 Chapter 8.14)
Post-decoder requirements on media
略(Ref:ISO/IEC 15444-12 Chapter 8.15)