ISO/IEC 15444-12 MP4 封裝格式標準摘錄 3
目錄
- 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
- Data Information 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_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