這個公眾號會路線圖式的遍歷分享音視頻技術:→→→。關注一下成本不高,錯過干貨損失不小 ↓↓↓
播放卡頓是播放體驗中另一個非常重要的指標,字節跳動曾經提供過一份數據:降低 7.7% 的卡頓率和 9.8% 的卡頓時長,帶來了 0.22% 的用戶觀看時長提升。
我們可以通過下面這些指標來反映播放卡頓的情況:
這幾個指標雖然都是反映播放卡頓的,但是差別還是比較大的,選那個指標更好呢?
當我們去定義卡頓這個負面的體驗時,我們可以先從理想情況出發往較差的方向遞推:
然后,我們再從最差的情況回溯,看最不能忍受的體驗是什么。怎么認知卡頓對用戶的影響,便決定了你該怎么選擇指標。
一種推理是:對于視頻消費場景,卡頓是一種常見的現象,用戶對視頻播放會卡是有心理預期的,所以有卡頓發生還能接受;但是用戶等待卡頓的耐心不足,所以卡頓時長稍微增加用戶就會流失。那么相對于卡頓次數,卡頓時長更是我們需要最重點關注的點。但這里還有一個不可忽略的背景因素,那就是觀看時長。用戶對卡頓時長的忍耐程度是相對于正常觀看時長而言的。
所以相對于卡頓率、平均卡頓時長和百秒卡頓次數,百秒卡頓時長可能是更能反映出用戶對卡頓感受的一個指標。因為一次播放中卡頓過 1 次或多次都算是卡頓過了,所以卡頓率不能很好的反應出用戶卡頓的次數多不多,卡頓的時間有多久。百秒卡頓次數能反映用戶卡頓的次數,但是不太能反映出用戶的卡頓時長。
當然,卡頓率、平均卡頓時長和百秒卡頓次數仍然可以作為輔助的指標來關注。
優化播放卡頓大致上可以分為幾個大方向:
播放器策略推流端策略CDN 策略
我們就從這幾個方向上來講解優化措施。
1、碼率調控1.1、碼率適配
下面是一些碼率調控的措施:
雖然有了上面這些碼率調控的措施,但是通常我們也不能對用戶一刀切,對所有的用戶都用同樣的碼率調控方式。比如,從拉流端來看,對于使用 WIFI 網速穩定且高速的用戶,我們可以播放高碼率高分辨率的流;對于使用 4G 網速容易抖動的用戶,我們可以播放低碼率低分辨率的流。從推流端來看,我們可以計算直播間的 ACU(直播間用戶總觀看時長/直播間總推流時長)來評估直播間的熱度及影響力,對于大主播我們可以推碼率高一點的流來提升畫質體驗,對于數據較多而觀眾分散的小主播我們則可以適當降低推流碼率。
參考:
1.2、H.265 降碼率
H.265 相對于 H.264 壓縮效率更高,在保持一定畫質的情況下使用 H.265 替換 H.264 可以降低碼率。
1.3、軟編降碼率
軟編相對于硬編有更好的靈活性,在有些設備上通過配置合適的編碼參數,可以在保持一定畫質的前提下比硬編使用更少的碼率。
2、播放器策略2.1、使用音頻緩沖區水位線來驅動起播
在直播流中,我們會發現有一些視頻 的 字段是空值的,但是它實際上是有時長的,如果在緩沖數據時,我們用視頻水位線來驅動起播,那就要卡頓等待更長的時間才能起播。比如:我們設置的是應該等待 100ms 的視頻數據才開始起播,由于有的視頻 的時長是空值,那么累積到 100ms 時長的視頻數據時什么視頻播放器可以減速播放,對應的實際視頻時長其實是大于 100ms 的,這就意味著卡頓了比預期更久的時間才起播,這樣就會造成百秒卡頓時長被拉高。
對于這種情況,我們發現音頻 的 字段值是正常的,所以可以使用音頻緩沖區水位線來驅動起播,可以保證起播前的緩沖造成的卡頓時長是更符合預期的。
此外,還需要從直播流鏈路定位視頻 的 字段是空值的原因,解決這個問題后,使用視頻緩沖區水位線來驅動起播也是可以的。
2.2、動態緩沖策略
當播放器發生卡頓后,先暫停播放流程,停止數據消耗,同時去等待下載線程加載更多的數據到緩沖區后再啟動播放,從而降低后續發生卡頓的概率。這里的暫停時長應該是多久,可以通過設計更細致的策略來決定,這里的策略跟我們的目標有關:是減少卡頓次數更重要,還是減少卡頓時長更重要。
這里介紹一種策略:三級緩沖水位策略。
這里的水位對應的是視頻緩沖時長或者音頻緩沖時長。
比如,三級緩沖水位可以設置為:500ms、、。
第一級緩沖水位指的是播放器第一次加載多少視頻數據后開始播放。這個值通常設置的比較低,這樣可以加快首次播放啟動的速度。比如上面設置的是 500ms。
第二級緩沖水位指的是播放器發生一次卡頓后,要加載多少視頻數據后開始播放。比如上面設置的是 。
第三級緩沖水位指的是播放器在發生卡頓后,最多要加載多少視頻數據后開始播放。比如上面設置的是 。
在第二級和第三級緩沖水位之間,可以有一個逐步升級策略。比如:第一次卡頓后,緩沖 的視頻數據后開始播放;第二次卡頓后,緩沖 2 * = 的視頻數據后開始播放;第三次卡頓后,緩沖 2 * = 的視頻數據后開始播放;第四次卡頓后,緩沖 MIN(2 * = , ) = 的視頻數據后開始播放;以后的卡頓都緩沖 的視頻數據后再開始播放。
2.3、低緩沖時低倍速播放
當播放器緩沖區的數據累積的較多時,對應的播放延時會比較大,這時候可以加速播放來加快對緩沖區數據的消耗從而降低延時;反之,當播放器緩沖區剩余的數據較少時,很有可能由于網絡原因造成數據下載的速度跟不上數據消耗的速度而發生卡頓,這時候可以低速播放來減慢對緩沖區數據的消耗從而防止卡頓。
下圖示例了一種倍速播放策略:
倍速播放策略2.4、短視頻緩存和預加載
短視頻的卡頓大部分是由于網絡原因導致的,加載本地數據比加載網絡數據要更可靠,所以可以從緩存的角度來優化短視頻的卡頓。
對于短視頻的卡頓,初次播放的視頻可以對視頻進行預加載來優化視頻播放卡頓。
重復播放的視頻可以通過實現視頻邊下邊播的緩存能力,并提升緩存命中率來優化。
2.5、設置卡頓超時
在實際的數據分析時,我們會發現有時候用戶開始卡頓,并且持續了很長時間也未恢復。這種情況可能是由于網絡狀況較差,雖然數據傳輸速度很慢,但是連接一直也沒有斷開,所以不會觸發播放器的報錯,播放器由于累積不到足夠數據,也無法啟動播放,所以導致卡頓時長很久。
這種情況什么視頻播放器可以減速播放,我們可以設置卡頓超時時長,當發現卡頓持續超過一定時長后,就上報事件到業務層,業務可以重新連接,防止卡頓過久。
3、推流端策略3.1、推流端支持退后臺繼續推流
在主播中,觀看端的有一些卡頓是由于主播的行為引起的,比如主播使用手機推流的時候有退后臺的操作,這時候推流斷流,相當于生產側的數據斷掉了,拉流端沒有數據自然會卡頓。對于這種情況,可以支持退后臺繼續推流,不過有幾點需要注意:
4、CDN 策略4.1、運營商效應和百秒卡頓時長的關系
現在的運營商紛紛推出無限流量但超過特定值會限速的套餐。這樣會造成使用流量套餐的觀看視頻或直播的用戶從月初到月末卡頓概率越來越高,跟卡頓相關的數據指標也就越來越差。
4.2、CDN 的吐數據策略
在 CDN 服務端來控制下發視頻數據的帶寬和速度。比如,在拉取直播流時,服務端將以數倍于平時帶寬的速度下發前面緩存的若干時長的數據給客戶端,這樣播放器在開播時能較快的拉取比較充足的數據,防止開播卡頓。
4.3、推流斷開后的 CDN 狀態優化
有的 CDN 廠商在會在拉流的節點緩存直播流的最后一個或多個 GOP,同時會配置這個緩存的有效時長(即在一定時長內沒有請求來拉取這段數據,則超時清空這個緩存)。
這樣一來,即使推流已經斷開,拉流端也會拉到 CDN 緩存的數據開始播放,但是由于這段數據有限,當消費完后,CDN 的返回的 HTTP 狀態碼就有比較大的影響了。
如果 CDN 返回 404 等報錯狀態,播放器就會報錯,此次播放終止。當然,如果客戶端對拉流報錯做了重試策略,這樣就會不停的重試再去拉同一份緩存數據。這種情況,通常不會影響卡頓,但是會造成播放成功率降低。
如果 CDN 返回 200,那么播放器就不會報錯,但是播放器的讀數據線程會因為讀不到數據進入加載狀態而計入卡頓,這種情況就會造成百秒卡頓時長上升了。
參考資料[1]
帶寬估計: #=h.