2015-04-01 26 views
1

我在寫一個簡單的使用HTML5視頻元素的mpeg-dash流媒體播放器。 我正在創建MediaSource並附加SourceBuffer。然後我將短劃分碎片添加到此源緩衝區中,並且一切正常。動態追加並從媒體源緩衝區中移除mpeg-dash段

現在,我想要做的是,我想根據媒體元素的當前時間動態預取這些段。 雖然這樣做有很多疑問,哪些沒有通過MediaSource文件回答。

  1. 是否有可能知道一次可以支持多少數據源緩衝區?如果我有一個非常大的視頻並將所有片段添加到源緩衝區中,是否會容納所有片段或導致錯誤,或者會使瀏覽器變慢?

  2. 如何計算源緩衝區中的碎片數量?

  3. 如何計算SourceBuffer中最後一個段的顯示時間或結束時間?

  4. 我們如何從SourceBuffer中只刪除特定的片段集,並用其他分辨率的片段替換它們? (我想這樣做以支持自適應分辨率切換運行時間。)

謝謝。

回答

3
  1. 緩衝數據的最大數量是一個實現細節,並不以任何方式暴露給開發人員AFAIK。 According to the spec,當追加新數據時,瀏覽器將執行coded frame eviction algorithm,刪除瀏覽器認爲不需要的任何緩衝數據。瀏覽器傾向於刪除已播放的任何部分流,並且不會刪除將來相對於current time的部分流。這意味着如果數據流非常大並且短劃線播放器很快下載,比MSE播放速度快,那麼會有很多流無法被coded frame eviction algorithm刪除,這可能會導致append buffer方法扔一個QuotaExceededError。當然,一個好的短跑選手應該監視buffered的數量,而不是下載過量的數據。

    純文本:除非播放器儘可能快地下載所有數據流,否則無需考慮當前的數量。

  2. MSE API與數據流(音頻或視頻)一起工作。它不知道細分。理論上,您可以使用MPD中提供的時序數據獲得時間範圍並映射到一對段。但這是脆弱的恕我直言。更好的是跟蹤下載和饋送的細分。

  3. 看看buffered屬性。獲得在最後附加段的秒結束時,最簡單的方法就是:videoElement.buffered.end(0)

    如果presentation time你指的是最後緩衝的幀的Presentation TimeStamp那麼有沒有從解析流本身除了這樣的方式。

  4. 要刪除緩衝的數據,您可以使用remove方法。

    Quality switching其實很簡單,雖然規格沒有多說。要切換質量,您唯一需要做的就是將append新質量的init標頭改爲SourceBuffer。之後,您可以像往常一樣追加新質量的細分。

我個人覺得youtube dash mse test player是一個很好的學習場所。

+0

重點1:這就是用戶代理的意圖,但在目前,似乎他們做得不好。在[其他問題](http://lists.w3.org/Archives/Public/public-html-media/2015Jun/0020.html)中,我從來沒有在Chrome中看到過一個'QuotaExceededError',你甚至可以看到拋出異常在[Safari的Webkit SourceBuffer.cpp](https://github.com/WebKit/webkit/blob/master/Source/WebCore/Modules/mediasource/SourceBuffer.cpp)中被註釋掉了。您可能必須暫時實施您自己的緩衝區管理。 https://www.w3.org/Bugs/Public/show_bug.cgi?id=28557 – 2015-06-15 15:03:49

0

sourceBuffer可支持的數據量取決於MSE實現,因此也取決於瀏覽器供應商。一旦你達到最大值,這當然會導致錯誤。

您無法直接獲取SourceBuffer中的段數,但可以獲得實際的緩衝時間。結合段的持續時間,您可以計算它。

我推薦看看開放源碼的DASH播放器項目,如dashjsExoPlayer,它們實現您所需的所有功能。或者甚至可以使用像bitdash這樣的商業解決方案。