目錄ide
感謝Google Translate,Microsoft Translate,通篇機翻,不保證絕對正確this
media presentation可能分段傳輸,好比 HTTP stream。將文件以分段或者連續分段的形式組織起來是可能的,其其不必定是造成符合ISO基礎媒體文件格式的文件(好比:它們不包含Movie box)。編碼
類型 | 容器 | 強制性 | 數量 |
---|---|---|---|
'styp' | File | No | 0 /more |
若是單個文件存儲segments(e.g. 在一個標準http server上),'segment files'中包含 styp box是推薦的,若是出現,必須是第一個,爲了分辨這些文件和使聲明符合規範。
styp 和 ftyp box 相似。其包含的brands也可能包含在在moov box以前的ftyp box中,也可能包含其餘的brands以兼容具備不一樣格式的segment。
一個有效的styp box應該是segment第一個box。若是segments被連接在一塊兒,styp box能夠被刪除,但這不是必須的。不是第一個box的styp box能夠被忽略。設計
類型 | 容器 | 強制性 | 數量 |
---|---|---|---|
'sidx' | File | No | 0 /more |
‘sidx’爲其應用的media segment中的一個媒體流提供緊湊索引。 它的設計使其不只能夠用於基於此規範的媒體格式(即包含sample tables或movie fragments的segment),還能夠用於其餘媒體格式(好比, MPEG‐2 Transport Streams [ISO/IEC 13818‐1])。出於此緣由,本處給出的通用描述,隨後給出在使用Movie fragment 時的具體定義。
每一個Segment Index box記錄了一個(sub)segment 是如何被劃分爲 一個或多個subsegments(它們還可能使用segment index box繼續劃分)。
subsegment被定義爲一段時間區間內包含的 (sub)segment,並對應於包含的 (sub)segment的字節範圍。全部subsegment的duration爲包含的 (sub)segment的duration的和。
sidx box中的每一個entry都包含一個引用類型,該引用類型指向被引用的lest-segment的媒體信息,或者指向了描述被引用的subsegment如何進一步劃分的sidx。結果,經過記錄應用於相同( (sub)segment的部分的其餘sidx的時間和字節偏移信息,能夠以「分層」或「菊花鏈」(daisy-chain)或其餘形式來index the segment。
每一個sidx box提供有關segment的單個媒體流的信息,稱爲參考流。 若是提供,則對於給定媒體流,段中的第一segment中的sidx box應記錄段中該媒體流的所有,而且應該在該segment中用於相同媒體流的任何其餘sidx box以前。
若是針對至少存在一個媒體流而不是segment中的全部媒體流的segment index,則一般選擇不對每一個訪問單元進行獨立編碼的媒體流(例如視頻)進行index。 對於沒有存在segment index的任何媒體流(稱爲non-indexed stream),與段中的第一sidx box相關聯的媒體流用做參考流,在某種意義上其還描述了任何non-indexed媒體流的 subsegment。
sidx box 可能與被索引的media內聯在同一個文件中,在某些狀況下,也能夠內聯在僅包含索引信息的單獨文件中。
sidx box包含對該box記錄了(sub)segment的一系列引用subsegment。 引用的subsegent在呈現時間內是連續的。 相似地,sidx box引用的字節在媒體文件和單獨的索引段中始終是連續的,或者若是索引放在媒體文件中,則在單個文件中是連續的。 引用的大小給出了引用的材料(material)中的字節數。code
media segment 可能被超過一個互相獨立的 "top-level"的sidx box 引用,它們中的任一個都索引了一個具備media stream的media segment。在包含多個媒體流的segment中, 引用的字節可能包含來自多個流的媒體, 即便 sidx box只提供一個媒體流的計時信息。
在包含 sidx box的文件中, sidx box的定位點(anchor)是該box以後的第一個字節。若是有兩個文件, 則媒體文件中的定位點是top‐level segment的開頭 (即若是每一個segment存儲在單獨的文件中, 則是segment文件的開頭)。包含媒體的文件中的材料 (也多是包含sidx box的文件) 從錨點指示的偏移量開始。若是有兩個文件, 索引文件中的material將從定位點開始, 即緊跟在 sidx box以後。
有兩個約束條件(a):subsegments在時間上是連續的,也就是說,循環中的每一個entry都是緊接着前一個的 (b):在一個給定的文件中,引用byte是連續的,如下一些可能性:
in its byte count,對sidx box的引用能夠包括在記錄subsegment的sidx box以後
在一個完整的文件中,使用first_offset
字段可以從被引用的media中區分出sidx box。
在一個完整文件中,可以從哪些被索引的meida附近的subsegment定位sidx box。
當使用包含segment index的單獨文件時,循環entry多是「混合類型」,一些是index segment中的sidx box,一些是媒體文件中的media subsegment。
配置文件可用於限制segment index的放置或index的總體複雜性orm
aligned(8) class SegmentIndexBox extends FullBox(‘sidx’, version, 0) { unsigned int(32) reference_ID; unsigned int(32) timescale; if (version==0) { unsigned int(32) earliest_presentation_time; unsigned int(32) first_offset; } else { unsigned int(64) earliest_presentation_time; unsigned int(64) first_offset; } unsigned int(16) reserved = 0; unsigned int(16) reference_count; //number of referenced items for(i=1; i <= reference_count; i++) { bit (1) reference_type; unsigned int(31) referenced_size; unsigned int(32) subsegment_duration; bit(1) starts_with_SAP; //whether the referenced subsegments start with a SAP unsigned int(3) SAP_type; //SAP type as specified in Annex I, or the value 0. unsigned int(28) SAP_delta_time; //indicates TSAP of the first SAP, in decoding order, in the referenced subsegment for the reference stream } }
reference_ID
提供了引用stream的stream ID。若是sidx被「parent」sidx引用,reference_ID
的值應該同引用者sidx box的reference_ID
值一致。
timescale
爲此box中的time和duration字段提供每秒刻度的時間刻度; 建議此值匹配參考流或track的時間刻度; 對於基於此規範的文件,即track的Media Header Box的時間刻度字段;
earliest_presentation_time
是timescale字段中指示的timescale中第一subsegment中參考流中任何內容的最先呈現時間; 最先的呈現時間來自訪問單元中的媒體或訪問單元的部分,edit list(若是有)不會忽略
first_offset
是包含媒體的文件中從錨點到索引材料的第一個字節的距離(以字節爲單位)
reference_type
置1表示引用的是一個sidx box。不然則是media content。若是一個單獨的index segment被使用,引用類型爲1的entry在index segment中,引用類型爲0的entry則在media 文件中。
referenced_size
從引用項的第一個字節到下一個引用項的第一個字節的字節距離,或者在最後一個條目的狀況下,到引用材料的結尾的距離;視頻
subsegment_duration
當引用是sidx box時,該字段攜帶該box中subsegment_duration
字段的總和; 當引用是一個subsegment時,該字段攜帶下一個subsegment(或下一個segment的第一個subsegment,若是這是segment的最後一個subsegment,參見流的任何訪問單元)的最先呈現時間之間的差別, 或參考流的結束呈現時間(若是這是流的最後一個subsegment)和參考流的任何訪問單元在參考subsegment中的最先呈現時間; duration與earliest_presentation_time
的單位相同;server
類型 | 容器 | 強制性 | 數量 |
---|---|---|---|
'ssix' | File | No | 0 /more |
In other words, this box provides a compact index for how the data in a subsegment is ordered according to levels into partial subsegments. It enables a client to easily access data for partial subsegments by downloading ranges of data in the subsegment
ssix box 提供了從 levels(由Level Assignment box指定)到被索引subsegment的字節範圍的映射。換句話說,此box提供了一個緊湊的索引,用於指示subsegment中的數據如何根據級別劃分爲部分subsegment。 它使客戶端可以經過下載subsegment中的區間數據來輕鬆訪問部分subsegment的數據。
subsegment中的每一個字節應明確分配給一個級別,所以範圍計數必須爲2或更大。 若是範圍與級別分配中的任何信息都沒有關聯,則可使用級別分配中未包括的任何級別。
每一個sidx box中應該有0或1個ssix box,它們僅索引 leaf subsegments,即僅索引subsegment但不包含segment index。 ssix(若是有)應爲關聯的sdix box後面的下一個box。 ssix box記錄前一個sidx box中指示的subsegment。
一般,從字節範圍構造的媒體數據是不完整的,即它不符合整個subsegment的媒體格式。索引
aligned(8) class SubsegmentIndexBox extends FullBox(‘ssix’, 0, 0) { unsigned int(32) subsegment_count; for( i=1; i <= subsegment_count; i++) { unsigned int(32) range_count; //媒體數據分組的部分subsegment級別的數量。 該值應大於或等於2 for ( j=1; j <= range_count; j++) { unsigned int(8) level; //the level to which this partial subsegment is assigned unsigned int(24) range_size; //size of the partial subsegment } } }
subsegment_count
是一個正整數,指定在此box中爲其指定部分subsegment信息的subsegment數。 subsegment_count
應等於緊接在前的Segment Index box中的reference_count
(即,movie fragment引用的數量)ci
類型 | 容器 | 強制性 | 數量 |
---|---|---|---|
'prft' | File | No | 0 /more |
producer reference time box提供相對掛鐘時間,在該時間點生成movie fragments或包含movie fragments的文件。 當這些文件實時生成和使用時,這能夠爲客戶端提供信息,使消費和生產可以以相同的速率進行,從而避免可能的緩衝區溢出或下溢。
此box與按位流順序跟隨它的下一個movie fragment box相關。它必須遵循段中的任何segment type 或 segment index box (若是有), 並出如今下面的movie
fragment box(它所引用的) 以前。若是segment文件包含任何producer reference time boxes, 則第一個文件應出如今該段中的第一個movie fragment box以前。
aligned(8) class ProducerReferenceTimeBox extends FullBox(‘prft’, version, 0) { unsigned int(32) reference_track_ID; //the track_ID for the reference track unsigned int(64) ntp_timestamp; //a UTC time in NTP format corresponding to decoding_time. if (version==0) { unsigned int(32) media_time; } else { unsigned int(64) media_time; } }
media_time
對應於與ntp_timestamp
相同的時間, 在用於引用track的時間單位中,並在產生媒體時在該媒體時鐘上測量。
略
略
略