Qzone視頻下載如何做到多快好省?

gilbert655 8年前發布 | 8K 次閱讀 Qzone 軟件架構

Qzone的日均視頻播放量已經突破了10億,其中Android端的播放量在總播放量中的占比超過70%,相比年初,播放量的增長了超過10倍。視頻下載是整個視頻播放的基礎,如果下載側出問題,則會造成整個視頻播放的失敗,這就對我們的視頻下載提出了非常高的要求。

基于此,我們將視頻下載總結為"多快好省"四個方面,以下載成功率、首次緩沖時長和緩沖概率為主要的技術指標對視頻下載進行優化。具體參數的優化結果見下表1,經過長時間的打磨,我們的視頻下載模塊的下載成功率已經達到了99.9%,視頻的首次緩沖時長1.2秒,二次緩沖概率低于1%,取得了良好的效果。下面我將從"多快好省"這四個方面,對我們主要的優化工作進行論述。

表1: 下載相關技術指標優化前后對比

技術指標 下載成功率 首次緩沖時長 緩沖概率
優化前 97.1% 2s 15%
優化后 99.9% 1.2s 0.9%

1. 多

在10億這個量級下,除了保證下載的成功率和下載速度這些主要參數之外,對于整個下載流程的監控、處理異常情況顯得格外重要。為了提升視頻的下載成功率、穩定性,監控整個下載流程,提升用戶體驗,我們采用本地代理的方式進行視頻下載。

在Android手機上播放在線視頻,最簡單的方式就是實例化一個MediaPlayer, 將視頻的URL通過setDataSource()設置給播放器,之后調用prepareAsync()和start()遍可以開始播放視頻。這種方式非常簡單,但其中最大的問題就是整個過程中的數據流完全由MediaPlayer控制,我們無法控制下載和播放的過程,也就導致我們沒有辦法提高成功率,優化用戶體驗。因此,Android側的視頻下載一般采用本地代理的方案實現。本地代理的方案即是指在播放視頻的時候,將視頻的URL轉換為本地URL(127.0.0.1開頭),在播放器通過本地URL請求視頻數據時,本地代理截獲這次請求,在經過本地的處理邏輯后,向服務器或者本地緩存請求數據。本地代理在獲得視頻數據之后,將數據轉發給播放器,具體的流程如下圖1所示:

圖1:本地代理數據流

相比起直接由播放器請求數據,本地代理的優勢是數據流由本地代理控制,我們可以在本地代理中加入緩存、預加載、防盜鏈等業務邏輯,這可以極大的提升視頻下載的成功率,減少視頻的緩沖時間,從而提升用戶體驗。

傳統的本地代理方案確實解決了播放器直連帶來的問題,但同樣也會產生一些問題,視頻下載和播放的業務邏輯復雜,過多的邏輯和下載本身耦合,給開發的過程帶來極大的不便,并且這樣也不容易接入第三方的下載器和對下載過程進行監控。因此,在經歷了兩個版本的迭代之后,我們將整個下載過程進行重構。這次重構使得下載各模塊的職責明確,便于開發、維護以及接入第三方的下載,也為我們后續的優化打下基礎,重構之后的方案會在之后單獨成文介紹。

2. 快

國外SmartBear的研究表明,57%的用戶在3秒沒有加載完網頁時就會放棄。在視頻播放上,加快視頻的加載速度,減少播放過程中的卡頓,對提高用戶觀看視頻的體驗有極大的幫助。經過我們長期的優化,現在Qzone視頻播放的接近秒開,緩沖概率下降到不到1%,這極大的提升了用戶體驗,也從側面提升了我們的視頻播放量。

在這數據提升的背后,我們主要做了幾個方面的工作:

2.1:防盜鏈預拉取

盜鏈播放在國內非常普遍,而盜鏈會使平臺資源流失,增加帶寬成本,不利于平臺的長期發展,國內大部分視頻服務提供商都在一定程度上做了防盜鏈。防盜鏈的主要過程是后臺下發的視頻URL,在正式播放之前,需要通過URL中的部分參數,加上一些本地參數,向后臺拉取真正播放的URL, 這些真正播放的URL都帶有時效性,這種方式可以從一定程度上避免盜鏈行為。但通過防盜鏈接口拉取真實的播放URL需要時間,這也在一定程度上延長了用戶感知的視頻加載時間。針對這種情況,我們對防盜鏈的模塊進行了改造,引入預拉取機制,將防盜鏈的拉取與播放解耦,對用戶的播放行為進行預判,在用戶播放視頻的過程中提前拉取并緩存之后視頻的URL, 從而減少了因為拉取防盜鏈URL造成的視頻緩沖時間。

圖2: 防盜鏈預拉取

2.2:數據預加載:

從MediapPlayer的源碼可以發現( AwesomePlayer.cpp ), MediaPlayer需要下載5秒的數據才會開始播放視頻,按照現在的外網平局下載速度計算,該過程的耗時在接近1秒,因此對于數據進行預加載是減少視頻首次緩沖非常重要的方法。但視頻數據的預加載不能跟當前播放的視頻搶下載帶寬,因此我們選擇以當前播放視頻的播放進度和數據緩存量為維度,當兩者同時達到一個閥值時開始下載下一個視頻的數據。在實踐的過程中,我們還發現,因為一些編碼格式的原因,MediaPlayer在播放視頻之前可能會請求一部分尾部數據,因此,視頻預加載還會加載一部分尾部數據,最大限度的保證預加載的效果。

2.3:緩存改造

MediaPlayer加載本地視頻的效率遠高于在線下載,因此,緩存的命中率會直接影響到視頻緩沖的速度。最初的緩存方案是針對單個視頻按照順序緩存,這樣實現簡單,但存在的問題就是無法對于播放空洞(非順序播放場景,例如拖動、續播等)進行緩存,這降低了視頻的緩存率和緩存命中率,增加了帶寬成本和視頻的緩沖時長。之后我們針對緩存模塊進行了改造,將順序緩存改為分片緩存,即將單個視頻的緩存按照一定大小進行分片,在遇到數據空洞或者緩存數據量達我們設置的單片緩存上限時,開啟下一個分片緩存,確保可以緩存所有的下載數據。這樣改造之后極大的提升了緩存命中率,降低了首次緩沖時間和二次緩沖的概率。

圖3: 緩存改造

2.4:性能優化

梳理下載和播放過程中整體的流程,通過工具排查流程中長耗時的點和優化過程中的邏輯,減少不必要的耗時和操作,并將部分耗時邏輯移入子線程;優化時序,將例如圖片加載、緩存IO等重邏輯執行的時機后移,以及對視頻播放關聯度不高的邏輯使用懶加載。這樣可以降低對于視頻播放,特別是視頻緩沖過程中,CPU和IO的占用,使得系統能夠調度更多的資源在解封裝、解碼、渲染等與播放、下載直接相關的操作上,進而減少這部分的耗時。

3. 好

下載的成功率是保證視頻觀看體驗的基礎,目前Qzone的視頻下載成功率已經提升至99.9%,跟主要命令字的成功率相當。國內的移動網絡環境錯綜復雜,不僅要處理斷網、慢速、抖動等網絡本身的題,還要處理跨網、運營商劫持等國情問題。下載成功率的提升過程非常艱難,我們在其中主要做了以下的工作:

3.1: IP直出與競速

通過IP直出減少了DNS劫持的可能性;對于下層代理的視頻下載下發多組IP,通過競速計算本地最佳IP,使用最佳IP進行直出下載;上層代理對于下層代理的整個下載過程進行監控,在監測到下載速度緩慢或者異常情況時(IP連接失敗、數據讀取超時等)立即切換下載IP,減少用戶的視頻加載時間。通過IP直出、競速和切換,提高了下載的連接、數據讀取成功率,減少了因DNS劫持導致下載失敗的概率,同時提高了下載速度。

3.2:對于鏈接失效(403)進行處理

上文(2.1章節)中提到Qzone視頻播放的鏈接均是經過防盜鏈處理,帶有播放效期的鏈接,這就使得,在實際播放的場景中,很可能出現用戶希望播放某視頻時,跟隨后臺下發的視頻鏈接已經過期失效的情況,如果不進行處理,則會極大降低下載的成功率。針對這種情況,我們根據視頻的不同來源,對于每種情況進行異化處理,通過向后臺重新拉取鏈接或者本地計算Key,解決了因連接中的Key失效導致視頻無法播放的問題。

3.3:下載命令字拉取接入私有通道

Qzone很早就開始采用維納斯(WNS, Wireless Network Service)私有通道方案進行網絡數據傳輸,相比使用最多的Http方案,WNS通過長連接、IP直出、接入點優化、數據壓縮等方法,提高了網絡連接的成功率和穩定性。為了提高主要命令字的拉取成功率,我們對原有用Http拉取命令字的方式進行改造,使用WNS通道包裹原來的Http數據包,在后臺通過WNS通道收到原有的請求后再將請求分發至對應的后臺,具體的流程如下圖4所示。這樣通過低成本的改造(不需要修改原有協議,后臺直接透傳基本沒有開發工作量),借由WNS提升了整個通道的傳輸質量,進而也提高了視頻的下載成功率。

圖4:下載命令字拉取接入私有通道

3.4:下載速率動態調節

在移動網絡下,發生網絡抖動和網絡切換經常發生,但網絡不穩定,對下載來說是非常致命的。為了應對網絡抖動和網絡切換,下層代理會監聽當前的網絡變化,監控當前的下載速度。下層代理在下載數據時,為了減少對于別的業務影響,不會占用全部的帶寬,但當發生頻繁的網絡切換時,下載代理會主動突破速度的限制,盡可能快的在網絡情況良好時下載數據,給之后的播放留下足夠的數據Buffer,保證整體播放的流暢性。

4. 省

互聯網的視頻服務提供商在國內盈利極其困難,除了近幾年視頻市場競爭越來越激烈,版權費居高不下之外,國內高昂的帶寬成本也是重要原因。因此,如何在保證視頻質量的前提下,盡可能減少下載流量,減少下載而產生的帶寬成本,對于我們來說也是非常重要的工作。在這部分,我們主要的工作如下:

4.1: 流量控制

為了保證用戶觀看的流暢性,減少視頻緩沖,視頻數據下載的可播放量與當前觀看的時間點之前會保持一定的Buffer,在整個播放過程中,通過動態調節下載速度,這個Buffer的大小基本保持不變,并且Buffer的大小可以動態調節。在流量高峰的時間段,我們會通過后臺進行流量控制,減少Buffer,也就減少了高峰時段整體的下載量。帶寬的計費標準一般按照高峰流量計費,減少了高峰時段的流量,也就降低了帶寬成本。具體流控如下圖,高峰時段視頻緩沖M秒,非高峰時段緩沖N秒,N>M,兩個參數均可由后臺控制。

圖5:流量控制

4.2: H265編碼

H265是新一代視頻編碼標準,相比原有使用H264編碼的視頻,具有更高的壓縮比,在畫質近似的前提下,H265編碼的視頻文件體積只有H264的一半甚至更少,因此,播放H265編碼的視頻能極大減少帶寬消耗。但H265現階段主要存在的問題是終端編碼耗時過長,后臺編碼過于消耗資源,以及在Android手機上,軟解碼(Android支持H265硬解碼的機型較少,并且硬解碼的兼容性問題相比軟解更多)帶來的耗電、發熱以及兼容性問題。目前,Qzone通過自解碼播放器,在經過大量的兼容性測試之后,已經在超過100款主流Android手機上實現了H265視頻的軟解播放。空間視頻H265和H264編碼的下載帶寬對比以及之后的預期情況如下圖6所示,可以明顯看出,通過H265編碼極大的降低了我們的視頻下載帶寬成本。

圖6:空間視頻H265和H264編碼下載帶寬比較

另外在2.3中論述對于視頻緩存的分片改造,同時提升了下載數據緩存的使用率和命中率,也了減少了我們的視頻下載帶寬。

5. 總結

經過長時間的優化,Qzone視頻業務,包括下載成功率、播放成功率、緩沖概率、首次緩沖時長等在內的主要技術指標,均得到了大幅度的提升,達到了我們的預期,也為Qzone視頻點播和直播業務的持續發力鋪平了道路。但技術優化是一個長期的過程,目前Qzone的視頻播放已經開始啟用自解碼播放器,逐步替換原生的MediaPlayer,之后我們還會通過播放器多實例,編解碼,參數調節等方式進一步提升視頻下載成功率,壓縮視頻緩沖時間,減少緩沖概率。也歡迎各位多使用Qzone體驗我們在各個場景中的視頻播放,如果對體驗或者技術優化的建議和意見,歡迎交流。

Qzone Android視頻 點播技術優化小分隊 : joltwang ,  michalliu ,  erainzhong ,  zakiwang , magilu .

 

 

來自:http://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=2649796895&idx=1&sn=3312ef21c1def99dde87eed07fdd7a5f&chksm=f1fcc547c68b4c51ce583f20c5ffe370d3bed3f586b59a372f5aaed81fe2e6a21d078692c1ee&mpshare=1&scene=1&srcid=1206EIWC1RX5TPMkUR3fDt7m#rd

 

 本文由用戶 gilbert655 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!