Media Source API - 自動確保依附加順序順暢播放媒體區段

只要提供 src 網址,即可使用 HTML 音訊和視訊元素載入、解碼及播放媒體:

    <video src='foo.webm'></video>

這在簡單用途上運作良好,但對於自適應串流等技術,Media Source Extensions API (MSE) 可提供更多控制選項。MSE 可讓您使用 JavaScript 建構音訊或影片片段串流。

您可以在 simpl.info/mse 試用 MSE:

使用 MSE API 播放的影片螢幕截圖。

以下程式碼取自該範例。

MediaSource 代表音訊或影片元素的媒體來源。一旦 MediaSource 物件已例項化,且其 open 事件已觸發,即可將 SourceBuffer 新增至其中。這些內容可當做媒體區段的緩衝區:

var mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function() {
    var sourceBuffer =
        mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
    // Get video segments and append them to sourceBuffer.
}

媒體區段會透過 appendBuffer() 將每個區段新增至 SourceBuffer,並「串流」至音訊或影片元素。在這個範例中,系統會從伺服器擷取影片,然後使用 File API 儲存:

reader.onload = function (e) {
    sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
    if (i === NUM_CHUNKS - 1) {
    mediaSource.endOfStream();
    } else {
    if (video.paused) {
        // start playing after first chunk is appended
        video.play();
    }
    readChunk(++i);
    }
};

設定播放順序

Chrome 50 為 SourceBuffer mode 屬性新增額外支援功能,讓您可以指定媒體區段以附加的順序連續播放,無論媒體區段最初是否有不連續的時間戳記。

請使用 mode 屬性指定媒體區段的播放順序。該事件具有以下兩個值之一:

  • 片段:每個片段的時間戳記 (可能已由 timestampOffset 修改) 會決定播放順序,無論片段附加的順序為何。
  • 序列:媒體時間軸中緩衝的片段順序,取決於片段附加至 SourceBuffer 的順序。

如果媒體片段在附加至 SourceBuffer 時,含有從位元組串流資料剖析而來的時間戳記,SourceBuffermode 屬性就會設為 segments。否則 mode 會設為「sequence」。請注意,時間戳記不是選用項目:大多數串流類型「必須」提供時間戳記,其他類型則「不能」提供時間戳記:內嵌時間戳記是包含內嵌時間戳記的串流類型的固有屬性。

您可以選擇是否設定 mode 屬性。對於不含時間戳記的串流 (audio/mpeg 和 audio/aac),mode 只能從 segments 變更為 sequence:如果您嘗試將 modesequence 變更為 segments,系統會擲回錯誤。對於含有時間戳記的串流,您可以切換片段序列,但實際上這可能會產生不理想、難以理解或難以預測的行為。

對於所有串流類型,您可以將值從「片段」變更為「序列」。也就是說,系統會依附加的順序播放片段,並相應產生新的時間戳記:

sourceBuffer.mode = 'sequence';

能將 mode 值設為 sequence,確保無論媒體片段的時間戳記不連續播放,還是附加不連續片段,都可確保媒體連續播放。如果有正確的串流中繼資料,應用程式可以使用 timestampOffset polyfill,確保持續播放,但序列模式可簡化程序,並減少發生錯誤的可能性。

MSE 應用程式和示範

這些範例會顯示 MSE 的運作情形,但不會操控 SourceBuffer.mode

瀏覽器支援

  • 預設為 Chrome 50 以上版本
  • 如要瞭解 Firefox 的相關資訊,請參閱 MDN

規格

API 資訊