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

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

共享 允許 his 多個 更多 並且 stc 位置信息 run

目錄

  • Track Data Layout Structures
    • Data Information Box
      • Data Reference Box
    • Sample Size Boxes
      • Compact Sample Size Box
    • Sample To Chunk Box
    • Chunk Offset Box
    • Padding Bits Box
    • Sub-Sample Information Box
    • Sample Auxiliary Information Sizes Box
    • Sample Auxiliary Information Offsets Box

感謝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_typeaux_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