1. 程式人生 > >ISO/IEC 15444-12 MP4 封裝格式標準摘錄 4

ISO/IEC 15444-12 MP4 封裝格式標準摘錄 4

目錄

感謝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_flagsfirst_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_onsample_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 的存在及其在檔案中的最後位置都不到保證。
c 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)