shell google Windows Firefox apache 微软 编程 开源 云计算 linux wordpress java nginx Ubuntu php 程序员 Python centos Android mysql

直播疑難雜癥排查(9)— 拖動不準

1. 問題現象

播放過程中,拖動進度條後,實際播放的位置跟松開拖動時的位置相差很遠。

2. 問題排查

由於直播流是實時產生和傳輸的,是不能拖動的,因此該問題主要出現在 “點播” 或者 “本地文件” 的播放。

2.1 基本概念

首先,我們要了解播放器拖動的基本原理:

視頻是由一系列圖像幀組成的,每一個幀都有對應的時間戳。拖動,就是告訴播放一個時間戳,由它直接跳轉到指定的這一幀開始播放。

拖動到的時間點 = (進度條的 progress / 進度條最大值 100 )x 視頻總時長

2.2 關鍵幀間隔太大

由於解碼器必須從 I 幀開始解碼,才不會出現花屏現象,因此,播放器通常會尋找離 seekTo 視頻幀最近的一個關鍵幀,從該關鍵幀開始解碼播放。

假設關鍵幀間隔(GOP)是 3s,那麽關鍵幀的時間點排列如下:

0s, 3s, 6s, 9s

如果拖動到 4s 的位置,那麽播放器就跳轉到第 3s 的關鍵幀開始解碼播放,因此,會產生一定的誤差。

關鍵幀的間隔越大,那麽這個誤差也就越大。因此,為了更準確地支持拖動,建議不要把關鍵幀間隔設置得太大。

2.3 直播丟幀

丟幀的情況多發生在直播場景,由於主播端的網絡抖動或者內存不足,導致不得不被迫丟掉一些視頻幀,而為了保證客戶端解碼後不出現花屏,丟幀往往伴隨著一整個 GOP 的丟棄。

當 GOP 丟失後,部分關鍵幀的間隔時間點就會變得更大了,從而導致拖動不準。

為了避免這種情況,建議推流端開啟動態碼率,在網絡不好的時候,主動降低碼率,快速發送掉緩沖區中累積的視頻幀,從而減少丟幀的情況發生。

延伸阅读

    评论