2016-02-27 110 views
2

上下文:

我正在構建一個基於媒體源擴展協議的自適應流媒體的html5視頻播放器。我正在使用mp4。自適應流媒體 - 避免有很多關鍵幀

問題:

我有同樣的視頻的兩個版本(假設高&質量差),我希望能夠用很少的延遲版本之間進行切換。問題是,當更改版本時,我需要有一個以關鍵幀開始的片段,並且在視頻中經常使用關鍵幀對帶寬非常不利。

我正在尋找一種方式來發送一個片段,當用戶更改版本和一個沒有關鍵幀其他的片段(我知道在Chromium中有一個bug有片段沒有關鍵幀,但讓我們暫時忽略它,現在它將要被修復)

我想複製視頻中的每個流與很多關鍵幀,並在另一個沒有(除了明顯的第一幀)然後在切換視頻版本時只使用帶關鍵幀的流。東西會看起來像這樣:

// * 
// * represents a key frame; * represents a normal frame; a fragment has 4 frames 

      * 
Stream A.1 **** **** **** **** **** **** **** // version A with no key frames 

      * * * * * * * 
Stream A.2 **** **** **** **** **** **** **** // version A with key frames 
               // at the beginning of each fragment 


      . 
Stream B.1 .... .... .... .... .... .... .... 

      . . . . . . . 
Stream B.2 .... .... .... .... .... .... .... 


      *   . 
A -> B  **** **** .... .... .... .... .... 
from  A.1 A.2 B.1 B.2 B.2 B.2 B.2 

所以每一幀可以是一個關鍵幀,或正常的框架,其前身可成功解碼。這將限制關鍵幀通過線路發送到最小的數量。

但是,嘿!從A1A2的切換被瀏覽器理解爲改變視頻流並且不起作用,因爲A2不以關鍵幀開始。

有沒有人有這樣一個結果可以實現的聰明想法?我目前正在考慮重寫客戶端中的moov和moof原子,以誘騙玩家認爲除了它之外的所有東西都是如此。但我不很瞭解......

動機:

我工作的一個360的球員。 360是很難的,因爲有很大一部分視頻是流式傳輸,但沒有顯示,這意味着在帶寬受限的情況下,顯示的視頻部分質量遠遠低於人們習慣使用的視頻質量。有一些工具和技術可以生成視頻的多個版本,每個版本都以不同的視圖方向爲中心,然後播放器決定在運行時流式傳輸哪個版本。由於用戶可以隨時更改視圖方向,所以能夠對這種變化做出快速反應非常重要,遠遠超過了字節速率自適應。而且由於這件事的目標是節省帶寬,因此通過添加大量關鍵幀開始會很糟糕!由於iOS Safari不支持內聯視頻,這是360播放器的關鍵,所以我很好地依賴iOS Safari不支持的MSE(嚴重的是,那些人在做什麼?)

回答

1

每個片段都需要以關鍵幀開始,因此切換可以正確進行;使這項工作的關鍵幀間隔應該勻的片段持續時間,例如正確的組合是:

  • 關鍵幀每2秒,片段長度6秒
  • 關鍵幀每4秒,片段長度8秒
+0

我希望片段很短,這樣我就可以在很少延遲的情況下在流之間切換。我不會除了用戶經常切換流,但延遲對我來說非常重要。所以我正在尋找一種像片段長度0.1s這樣的方法,並沒有太多的關鍵幀。我的嘗試是避免讓所有片段以關鍵幀開始,同時仍然能夠切換流 – Guig

+0

我不相信片段長度如此之短是一個好主意,您會添加很多(我的意思是很多)開銷和流在很多情況下可能會變得非常不穩定,即使如此,只有在切換髮生時才使用不同的片段和關鍵幀纔會改變播放器邏輯,但我不能否認您提出的內容非常有趣,但你有什麼想分享?我想看看 – joyrex

+0

還沒有,我已經適應了這個優秀[post](http://blog.wirewax.com/building-a-media-source-html5-player-with-adaptive-streaming-25 /)在webm到mp4,並嘗試了一些不成功的東西 – Guig