- Movie Fragments
- Movie Extends Box
- Movie Extends Header Box
- Track Extends Box
- Movie Fragment Box
- Movie Fragment Header Box
- Track Fragment Box
- Track Fragment Header Box
- Track Fragment Run Box
- Movie Fragment Random Access Box
- Track Fragment Random Access Box
- Movie Fragment Random Access Offset Box
- Track fragment decode time
- Level Assignment Box
- Track Extension Properties Box
- Alternative Startup Sequence Properties Box
- Sample Group Structures
- User Data
- Metadata Support
- Support for Protected Streams
- File Delivery Format Support
- Sub tracks
- Post-decoder requirements on media
感谢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’){
}
Movie Extends Header Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
'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'){
}
Movie Fragment Header Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
'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'){
}
Track Fragment Header Box
类型 | 容器 | 强制性 | 数量 |
---|---|---|---|
'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)
Metadata Support
略(Ref:ISO/IEC 15444-12 Chapter 8.11)
Support for Protected Streams
略(Ref:ISO/IEC 15444-12 Chapter 8.12)
File Delivery Format Support
略(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)