微博客户端播放器的演进之路
近年來新浪微博圍繞著快速上線、快速啟播、成本節約、穩定性等問題對客戶端播放器進行了一系列優化,以求為用戶提供更好的服務體驗。本文來自新浪微博高級多媒體工程師劉文在LiveVideoStackCon 2018音視頻技術大會中的演講,并由LiveVideoStack整理而成。
文 / 劉文
整理 / LiveVideoStack
大家好,我是來自新浪微博的劉文。今天給大家分享的題目是微博客戶端短視頻播放器的演進之路。在這里主要給大家介紹一下為了更好的服務業務,我們是如何對播放器的體驗進行改善、優化的。
主要內容包括以下三部分:
1、微博短視頻業務介紹;
2、基于漏斗模型的體驗優化;
3、畫質提升優化;
一、?微博短視頻業務介紹
如下圖所示,短視頻在這幾年的大爆發我們都是有目共睹的。從2015年底,就Facebook和Snapchat來說,它們的日均播放量都已經達到了65億以上。從那時開始,國內也有很多公司開始跟進,開始布局自己的短視頻業務,微博也是從那個時候開始加入了短視頻業務。
?
如上圖所示,從2016年至今,中國短視頻的市場規模增長速度是非常之快的。那么經過這幾年的發展,微博短視頻業務的形態是什么樣的呢?
?
從目前來說,微博的短視頻業務主要包括兩種形式:微博視頻和微博故事。微博視頻存在于信息流和推薦流,當用戶滑動到視頻內容時,觸發自動播放,主動為用戶播放視頻的內容。微博故事主要是豎版視頻,有獨立入口,主要用來分享用戶最近24小時內發生的故事。
那么,針對上述兩個業務場景,我們的播放器技術做了哪些事情呢?
二、?基于漏斗模型的體驗優化
1、業務指標
為了服務好業務,我們首先要思考業務的核心指標是什么?
?
業務的核心指標是有效播放,有效播放指的是大于3秒的視頻播放,這是播放器優化中的一個重要指標。
2、漏斗轉化模型
業務指標有效播放存在這樣一個漏斗轉化模型,包括從曝光到播放再到有效播放。
?
有效播放首先來自于所有的播放,而播放又來自于對視頻內容的曝光,那么在有效播放的指標轉換過程中,從播放器的角度看我們可以在哪些環節來開展一些優化進而實現指標的提升呢? 我們一層層來看。
3、播放轉化率提升
?
首先,我們來考慮漏斗模型的第一層,從曝光到播放階段怎么提升播放轉化率。我們上線了自動播放業務。自動播放指的是在信息流里碰到視頻就自動播放,也就是只要曝光就觸發播放。從理論上來說,如果我們上線了這個功能,那么曝光到播放的轉化率就是百分之百。要上線這個功能,我們必須先要解決一些基本的體驗問題。
?
自動播放在業務上面臨哪些挑戰呢?
第一,自動播放涉及到多個視頻間的頻繁切換,這樣一來,它對視頻基本體驗的要求是UI不卡頓。第二,對于已經播放過的視頻,當再次播放時,我們希望它能延續上一次播放結束的地方繼續播放(續播),對于續播我們要求它的播放是準確的,這樣才能夠保證良好的體驗。第三,在信息流、視頻流滑動的過程中,對于單個視頻自動播放有可能會引發重復播放,對于重復播放我們要求不會造成用戶數據的浪費。在實際上線這個功能時,上述問題我們都需要一一解決。
?
為了解決這些問題,我們的解決辦法是什么呢?
第一,為了解決UI卡頓的問題,我們將所有播放器API異步化。第二,為了保證續播的準確性,我們支持了視頻的精確seek。其中為了提升精確seek效率,參考了iOS播放器的接口設計,支持seek前后容差的設定,并且對非參考B幀不進行解碼,盡可能的減少精確seek中的解碼消耗。第三,為了不浪費用戶的流量,對于重復播放,我們設計了具有緩存能力的下載模塊。
?
下載模塊的工作原理是代理播放器的IO。此外,我們需要考慮點播場景下的用戶行為特點,用戶的seek拖拽會造成緩存文件出現空洞,下載模塊必須支持分片緩存管理, 如下圖所示。
?
最終的下載模塊建立在分片緩存文件管理的基礎上,包括接口層、IO管理、緩存文件系統。通過播放器代理接口接入到播放器,解決了自動播放過程重復下載浪費的問題。
?
2015年,我們實現這個功能的灰度上線,我們對實驗效果進行了對比統計,播放量增加了四倍,但帶寬成本也增加了兩倍。
?
由于帶寬成本太高,我們無法實現全量上線這個功能。從播放器的角度來說,我們應該盡可能的避免流量的浪費。在自動播放場景下,流量浪費的形成原因和發生的規模是什么樣子的呢?
由于下載沒有限速。在自動播放的過程中,數據加載過快,已經的播放進度遠遠小于已經下載的進度,如果用戶沒看完視頻很早退出,就會存在很大的下載浪費。如下圖所示。
?
在用戶觀看的過程中,他們會篩選自己喜歡的內容播放。通過日志統計發現,有60%的視頻播放時長是小于3秒的,也就存在大量的播放早退現象。所以,在自動播放場景下,視頻播放存在大量的下載浪費。
?
為了解決這個問題,我們必須進行一定的下載限速。下載限速的規則如下圖所示:
?
當播放器播放時長小于3秒時,只加載5s的數據;當播放時長小于視頻總時長的15%時,加載15s的數據;當播放時長大于視頻總時長的15%時,不限制下載。?
在2016年上半年,我們通過解決自動播放功能帶來的基本體驗問題以及成本過高的問題,實現了自動播放功能的全量上線,促成了漏斗模型中從曝光到播放的轉化。
4、有效播放轉化率提升
再來看漏洞模型的第二層,我們需要努力實現播放到有效播放的轉化。
?
首先,我們要回答播放最終都可能會轉變成什么?然后看哪些部分是可以減少,并向有效播放轉化的。播放最終會轉變成三種狀態:異常、取消播放和成功播放。
?
異常可以細分為播放錯誤和崩潰兩種狀態,一般是由網絡出現問題或者播放器出現bug導致的,這是比較嚴重的體驗中斷行為是我們必須要處理的。取消播放指的是用戶等了一段時間后,視頻沒播出來,用戶取消了觀看。可以細分為等待播放時間小于1秒和等待時間大于1秒兩種狀態。等待時間小于1s的取消,我們認為是快速滑動中自動播放產生的無效播放,這部分沒辦法去縮減。等待大于1s的,是用戶想看但是由于加載慢最后選擇了放棄。這部分我可以通過秒開優化去轉化。成功播放包括小于3s的播放和大于3s的播放。小于3s的播放,我們認為是對播放的內容不敢興趣。這部分播放器優化切入的點很有限 。
通過對播放轉化的分析,我們確認了連續性和加載速度兩個體驗維度的優化。其中觀看連續性指的是錯誤率與crash率的處理。盡量促成播放在1S內成功加載。
一)加載速度優化
在加載速度上我們使用PSR1(Play Success Rate 1 second)也就是1秒內成功開播的百分比作為我們的指標。為了找到加載過程的耗時點,我們進行日志打點分析,并把加載時間分為IO時間和處理時間兩個部分。經過上線分析,發現首幀加載時間為2s,大部分時間是IO消耗。
?
IO主要包括網絡IO和本地IO,而網絡IO與本地IO對比是很慢的。因此,減少啟播過程中網絡IO,是提高首幀時間的有效方法。考慮到用戶觀看視頻的內容篩選行為,很多播放是小于3s的,我們對即將播放的視頻做了3s預先加載
?
為了減少預加載對播放的影響,我們需要將預加載和播放中的下載統一在一起進行管理,為此對播放器下載模塊進行了重構。
對于啟播過程中的處理時間,雖然占比小,但是還是有優化的空間。處理過程主要包括解析、解碼和控制三個步驟。為了優化處理的速度,對于解析過程,我們采取忽略幀率估計、避免重復解碼的策略;對于解碼過程,我們采取了解碼器異步初始化;對于控制過程,我們采用首幀解碼后即顯示和buffer延遲的策略。
?
通過對IO時間和處理時間的優化,加載時間優化到了450ms,PSR1值從80%提升到了93%。
?
二)連續性優化
連續性優化主要包括兩個方面:錯誤率和Crash率。這兩類問題沒有什么統一的處理標準和方法,只能一個個解決。為了提升效率,必須依靠一個強大的日志系統來進行分析,如下圖所示。
?
第一,降低錯誤率;
?
對于錯誤而言,錯誤信息的梳理很重要,包含錯誤碼和播放trace。其中,錯誤碼比較簡潔、利于統計。播放trace記錄了單條播放中,核心步驟的執行情況,對于單個錯誤的分析非常有效。通過一個個的解決,我們的錯誤率從開始的平均0.5%降低到了0.2%以下。
?
第二,降低Crash量;
?
在Crash上,我們花了很多的精力,難點在于由內存問題導致的詭異堆棧。為了快速定位問題所在,一方面我們主要是通過內存分析工具來幫助發現內存的一些隱患;另一方面,對于一些不容易出現的問題,我們通過在壓力環境下模擬堆棧發生的邏輯來提高它的復線率。最終,我們的Crash率得到了控制,每千萬次播放的Crash量從450多次降到了4次。
?
5、小結
總結一下有效播放轉化率提升的過程,我們主要是圍繞漏斗轉化模型來開展優化工作,包括從曝光到播放和從播放到有效播放兩個階段。從曝光到播放過程主要優化的是基本體驗和成本過高的問題,從播放到有效播放過程主要優化的是觀看連續性和加載速度。
回顧我們之前的思路,為了更好的服務業務,我們主要從用戶體驗的連續性和加載速度兩個維度開展優化。這兩年隨著帶寬條件的改善,客戶對畫面質量的要求也越來越高,視頻畫面質量提升將是趨勢。 畫面質量體驗的好壞對業務的影響也會越來越大,所以畫面質量優化是我們目前一個重點方向。下面給大家介紹下我們質量提升方案的選擇與初步嘗試。
三、?畫質提升優化
?
我們都知道提升畫質會導致碼率上升,要改善畫質我們是不是把所有視頻內容的碼率都提升就可以了呢?答案肯定是不行的。如果我們集中提高碼率會導致卡頓上升,這主要是因為碼率和網速之間的不匹配造成的。
從所有用戶的角度看,假設用戶的帶寬分布如下圖所示,一種清晰度不可能適應所有用戶的帶寬 。
?
從單個用戶的角度看,用戶觀看視頻的過程中,網絡是波動的,提供一種清晰度是沒法滿足單個用戶的單次播放的。
?
因此,如果我們有多種分辨率,而且我們可以根據用戶的帶寬給它匹配當時他能播放的最高碼率,那么這樣的話,我們就可以既保證基本的流暢性體驗,又可以盡可能的提升畫面質量。
?
所以,我們的畫質提升方案是基于多碼率的自適應碼率方案,這就需要播放器有自適應碼率切換的能力。在這個過程中,我們需要解決兩個問題:支持多碼率協議播放和碼率自適應切換能力。
一)支持多碼率協議
現在工業界的多碼率協議主要有蘋果的HLS、微軟的MSS和標準化組織定義的DASH等,其中DASH相對來說更加通用,是國外很多大廠目前也正在使用這個協議, 所以我們采用DASH作為我們支持的對象。
?
在支持這個協議播放的過程中,我們對加載速度進行了優化。因為DASH的起播還是相對比較復雜的,音視頻是分離的,單個fmp4請求包含了多個segment請求。一方面,我們把多個segment請求進行合并;另外一方面,我們對音視頻的fmp4請求進行了并發處理。通過這樣的優化,目前為止Dash在線上的播放PSR1和我們普通視頻的PSR1的值是相近的。
?
二)碼率自適應切換能力
對于自適應碼率切換,現在已經上線了手動切換,而自動切換還處于實驗室階段。這里主要說一下手動切換。
?
手動切換主要解決切換這個動作平滑性的問題。思想就是在切換實時性和平滑性間做一個折中,損失一定的實時性來保證切換動作的平滑性。 具體而言,其實就是利用正在播放的清晰度的緩存時間,準備下一個清晰度的播放。
四、?總結
?
總的來說,播放器服務業務的過程,就是對播放器體驗優化的過程。體驗優化的方向大家的做法都是類似的,包括加載速度、連續性和畫面質量。不同的就是我們如何圍繞著業務的需求去思考我們什么時間做什么優化。
點擊【閱讀原文】或掃描圖中二維碼了解更多LiveVideoStackCon 2019 上海 音視頻技術大會 講師信息。
總結
以上是生活随笔為你收集整理的微博客户端播放器的演进之路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何优化WebRTC提升直播体验?
- 下一篇: 视频创作助力企业营销