Media Source Extension官方文檔(第二部分)

2. MediaSource Object

MediaSource對象表示HTMLMediaElement元素的一個媒體數據源。它會記錄源的readyState和一個能夠添加媒體數據去展現的SourceBuffer對象的列表。MediaSource對象由web應用建立而後綁定到HTMLMediaElement元素上。web應用經過添加SourceBuffer對象給sourceBuffers屬性從而添加媒體數據到source中。當須要播放的時候,HTMLMediaElement從MediaSource對象中讀取媒體數據。web

每一個MediaSource對象都由一個實時的可檢索的range變量來存儲歸一化後的TimeRanges對象。當MediaSource對象建立的時候這個變量初始化爲一個空的TimeRanges對象,經過setLiveSeekableRange() 和 clearLiveSeekableRange()方法來維護,而後經過HTMLMediaElement Extensions 來更改HTMLMediaElement.seekable屬性。
ReadyState 算法

狀態值 描述
closed 表示source尚未綁定到media元素上
open source被media元素打開而且有可用的SourceBuffer對象在sourceBuffers中
ended source還被綁定在media元素上,可是endOfStream() 執行過了

構造函數 瀏覽器

[Constructor]
interface MediaSource : EventTarget {
    readonly attribute SourceBufferList    sourceBuffers;
    readonly attribute SourceBufferList    activeSourceBuffers;
    readonly attribute ReadyState          readyState;
             attribute unrestricted double duration;
             attribute EventHandler        onsourceopen;
             attribute EventHandler        onsourceended;
             attribute EventHandler        onsourceclose;
    SourceBuffer addSourceBuffer(DOMString type);
    void         removeSourceBuffer(SourceBuffer sourceBuffer);
    void         endOfStream(optional EndOfStreamError error);
    void         setLiveSeekableRange(double start, double end);
    void         clearLiveSeekableRange();
    static boolean isTypeSupported(DOMString type);
};

2.1 屬性值

sourceBuffers 類型:SourceBufferList,只讀
MediaSource相關的SourceBuffer列表,當readyState=="closed"的時候老是空的,一旦readyState變爲"open"狀態時,就能夠經過 addSourceBuffer()方法添加SourceBuffer對象到列表中app

activeSourceBuffers 類型:SourceBufferList,只讀ide

sourceBuffers中selected video track, the enabled audio track(s), and the "showing" or "hidden" text track(s)的一個子集。函數

readyState 類型:ReadyState,只讀
MediaSource對象的當前狀態,剛建立的時候必定是‘closed’。rest

duration 類型:unrestricted double
MediaSource剛建立的時候,初始化值爲NaN。
如何獲取?code

  1. 若是readyState爲closed,則返回NaN,這一步能夠丟棄
  2. 返回該屬性當前值
    如何設置?
  3. 若是設置了負值或者NaN,會拋出TypeError異常,並丟棄剩餘步驟
  4. 若是readyState不是open,會拋出InvalidStateError異常,並丟棄剩餘步驟
  5. sourceBuffers屬性中的任何一個SourceBuffer的updating值爲true, ,會拋出InvalidStateError異常,並丟棄剩餘步驟
  6. 運行duration change algorithm算法能夠設置新的duration給當前屬性

Note
若是當前有更高end time的緩衝幀,duration change algorithm會調整新的更大的duration。
appendBuffer()和 endOfStream()方法會更新duration在特定的狀況下。對象

onsourceopen 類型:EventHandler
sourceopen事件的處理回調事件

onsourceended 類型:EventHandler
sourceended事件的處理回調

onsourceclose 類型:EventHandler
sourceclose事件的處理回調

2.2 方法

addSourceBuffer
入參:type, 返回SourceBuffer對象,調用如:

sourceBuffer = ms.addSourceBuffer('video/mp4; codecs="avc1.4d401f"');

添加一個新的SourceBuffer對象到sourceBuffers屬性,接下來ua須要執行:

  1. 若是type爲空字符串(''),則拋出TypeError異常,並丟棄剩餘步驟
  2. 若是type爲不支持的MIME類型,則拋出 NotSupportedError異常,並丟棄剩餘步驟
  3. 若是ua不能處理更多的SourceBuffer內容,則拋出QuotaExceededError異常,並丟棄剩餘步驟

好比當媒體元素到了HAVE_METADATA狀態的時候,ua就不支持播放中更多track的添加了

  1. 若是readyState不是open,則拋出InvalidStateError異常,並丟棄剩餘步驟
  2. 常見一個新的SourceBuffer對象和相關資源
  3. 設置新對象的generate timestamps flag爲相關類型的[MSE-REGISTRY] entry
  4. 若是generate timestamps flag值爲true,設置新對象的mode屬性爲「sequence」,不然設置爲「segments」
  5. 把新對象添加到sourceBuffers中,而且觸發一個addsourcebuffer事件
  6. 返回這個新對象

removeSourceBuffer

endOfStream
入參:error(EndOfStreamError),無返回值

  • setLiveSeekableRange*
    更新 HTMLMediaElement Extensions元素的live seekable range變量
  • clearLiveSeekableRange*
  • isTypeSupported* static
    檢測MediaSource對象是否支持建立特定MIME類型的SourceBuffer

只表明瀏覽器是否支持的能力,不表明addSourceBuffer()方法有足夠的資源建立新的SourceBuffer

2.3 事件

事件名稱 描述
sourceopen readyState 從close到open 或 從ended到open
sourceended readyState 從open到ended
sourceclose readyState 從open到closed 或 從open到ended

2.4 算法(待補充)

相關文章
相關標籤/搜索