vivo 短視頻體驗與成本優化實踐

作者:來自 vivo 互聯網短視頻研發團隊

本文根據蔡創業、馬運傑老師在“2023 vivo開發者大會"現場演講內容整理而成。

在線點播場景,播放體驗提升與成本優化是同等重要的兩件事,並在部分場景體驗優化與成本優化存在一定的互斥關係。vivo短視頻深入分析播放鏈路的每個環節、並結合大數據統計,探索出了多種的體驗優化策略;同時針對成本優化,上線了轉碼、PCDN、共享閒時帶寬等多種策略用於降低帶寬成本。基於技術優化和業務發展的要求,vivo短視頻還上線了系統性的監控體系,對播放體驗、帶寬成本進行了多維度的監控。

一、業務介紹

vivo短視頻項目的業務架構,從鏈路上來說,主要包括:

  • 內容生產,主要包括拍攝、導入、剪輯以及作品上傳

  • 視頻處理,包括畫質增強、轉碼、壓縮等

  • 分發

  • 消費,包括預加載、視頻播放

除此之外,我們還設計了若干個子系統,其中比較重要的有:

  • 日誌收集,主要用於收集用戶主動反饋問題。

  • 監控統計,主要用於監控線上核心指標,爲後續優化提供方向。

  • AB測試,主要用於新功能驗證。

技術架構的最終目的是爲了給用戶呈現一個有着良好體驗的產品,同時又兼顧到開發、運營成本。通過我們產品內置的意見反饋、大數據統計以及用戶調研,我們發現/用戶對vivo短視頻的反饋主要集中在播放卡頓、不流暢、畫質不清晰上面,從成本方面,我們的主要壓力來自於CDN。

這些也就是本文的主題,即:如何做到既要播放體驗好,又要業務成本低。接下來,將分別介紹一些在播放流暢度以及成本優化相關的探索和實踐。

圖片

二、體驗優化

2.1 播放鏈路拆解

對於在線點播場景來說,影響用戶體驗的環節主要在視頻開播以及播放過程。首先,在起播階段,應盡力做到首幀零耗時,當用戶觀看視頻時應直接展示視頻畫面而不是出現等待過程。

我們對開播過程做了拆解和監控,在無任何優化策略的場景下,網絡連接環節耗時佔比30%,下載環節佔比15%, 解封裝、解複用環節佔比15%。

其次,在視頻播放過程中,應做到流暢播放不卡頓,這就需要合理的預加載策略、碼率控制以及下載策略。

通過以上的分析,確定了我們4個重點優化方向

  • 建連優化,通過連接複用、保活等方式減少在連接環節的耗時

  • 分片下載,通過優化下載架構提升下載速度以及成功率

  • 預渲染,把耗時的解封裝、解複用、解碼等環節前置

  • 數據預加載,通過預加載減少在下載環節的耗時

在此基礎上,我們上線了數據監控體系,對開播性能、優化策略、視頻基礎信息、畫質、帶寬利用率等方面進行了詳細的監控。

圖片

2.2 建連優化

通過以下4個策略來降低建連環節的耗時:

  • 在應用冷啓動以及視頻播放時,通過連接複用,減少了DNS解析、SSL以及TCP連接環節的耗時。

  • 在視頻播放過程中,用戶可能因爲某些原因暫停視頻,比如把應用切到後臺,幾分鐘後再打開 應用,這種情況下可能出現連接被斷開,當恢復播放時需要重新建連,從而導致播放卡頓的問題。通過連接保活,可確保再次播放時視頻快速下載、快速 開播。

  • 傳統的local dns可能會出現解析DNS劫持、解析緩慢等問題,通過http dns,可有效應對DNS劫持以及解析緩慢的問題,爲了應對複雜多變的網絡環境,我們還通過在線配置的方式,支持多種dns解析以及降級策略。

  • 當DNS解析失敗時,通過服務端下發的IP實現直連,從而提升連接成功率。

以上就是我們在網絡連接環節的一些優化策略,下面介紹我們在視頻下載環節的優化。

圖片

2.3 分片下載

爲了實現預加載,即在視頻播放之前把在線視頻提前下載到本地,我們在播放器和CDN直接增加了一個本地代理的服務,播放的網絡請求都由本地代理服務響應,本地代理服務再向CDN發起請求。在弱網下測試,我們發現卡頓情況比較嚴重,主要是存在不必要的網速競爭,並且常規單線程下載效率低於多線程併發下載。爲此,我們通過分析協議以及多次實驗,最終確定了全新的下載方式,即首個視頻起播時使用單線程,後續的視頻下載以及預加載都通過多線程分片請求完成。

同時,把播放器 與本地代理之間的socket通信方式修改爲直連,避免了socket中不必要的讀寫緩衝區浪費。通過這樣的調整,首幀耗時降低3.8%,播放失敗率下降9%;並且還具備了播放過程中實時切換cdn的能力,即在首次開播時使用性能較好的標準cdn,在緩存較充足時切換爲低成本的cdn。

圖片

2.4 預渲染

通過以下優化策略提升預渲染效果:

  • 應用冷起後,首個視頻的開播體驗對用戶的後續消費有着非常重要的影響,爲了提升該的播放體驗,在應用啓動時預創建H265以及H264對應的codec實例,在開播環節直接使用預創建的解碼器,開播耗時可降低50ms左右。

  • 播放器的創建環節涉及到較多的流程,比較耗時;另外,常規的每次播放視頻都創建一個播放器對象的方式,容易出現因播放器對象泄漏導致的OOM、ANR甚至播放失敗。基於這兩個問題,我們創建了全局複用的播放資源池,每次視頻播放時都從資源池中直接獲取已經創建好的播放器對象,通過該策略,可有效的降低播放器創建耗時,並且徹底解決了播放器實例泄漏問題,對系統穩定性以及播放成功率都有明顯的改善。

  • 前面我們介紹了預加載策略,即在視頻播放之前提前下載部分數據到本地,視頻播放時直接播放本地準備好的緩存,開播速度較優化前有明顯的提升;但本地視頻開播仍需要嗅探、解封裝、解碼這些環節,開播耗時仍存在優化空間。因此,我們基於播放器資源池,使用另一個空閒的播放器對象來提前完成下一個即將播放的視頻的嗅探、解封裝、解碼過程,通過這個策略,首幀耗時可降低到50ms以內。

圖片

2.5 預加載策略

首先介紹的是固定大小的預加載策略:視頻播放時,把後續5個視頻添加到緩存待下載隊列,每個視頻使用固定的預加載大小,當前視頻的緩存處於高水位時,開始下載緩存隊列中視頻,當前視頻緩存處於低水位即有可能即將發生卡頓時,停止下載緩存隊列中的視頻。

這個方案整體實現比較簡單,但存在兩個問題

  • 預加載大小是固定的,未能與視頻碼率、時長關聯,當視頻碼率、時長髮生變化時,可能會出現緩存不足或者緩存浪費。

  • 對於一條用戶會重度消費的視頻,應提升預加載大小,從而提升用戶在播放過程中的流暢度。

爲了解決以上兩個問題,我們上線了動態預加載策略。

圖片

動態預加載就是在固定預加載的基礎上,做了如下調整:

  • 緩存分級,把固定預加載策略中的單一緩存調整爲3個不同優先級的緩存,優先級高的緩存較小,優先下載,優先級較低的緩存較大,下載優先級較低;一級緩存下載結束後開始下載二級緩存,二級緩存下載完成後再下載三級緩存。

  • 緩存大小不再固定,修改爲根據視頻時長和預加載時長動態計算當用戶快速滑動時,一般情況下會命中一級緩存,確保視頻可以順利開播;當用戶在列表中重度消費時,後續的視頻將有充足的時間完成三級緩存的下載。

 

動態預加載策略上線後,首幀耗時降低了2.3%,卡頓率降低了19.5%,當然,這個策略也存在的明顯的問題,即體驗提升了,但帶寬成本也提升了。我們需要思考,如何在不增加成本的前提下提升體驗。

圖片

我們來看一個示例:在一個視頻列表中,有些視頻用戶喜歡觀看,完播率較高,有些視頻用戶不感興趣,會快速滑過。

也就是說,只有深度消費的視頻,才真正的需要二級和三級緩存,快滑的視頻能快速開播即可。基於這樣的一個普遍性的案例,我們結合視頻的觀看時長調整了預加載策略。

現在介紹的是智能預加載策略,整體流程如下:

  • 首先,在雲端基於視頻基礎特徵比如碼率、時長、清晰度,網絡以及時段、歷史行爲等特徵,使用深度神經網絡創建、訓練模型,用於預測一個視頻用戶會深度消費還是快速滑過。

  • 其次,模型導出、轉換之後,部署在客戶端,在視頻開播之前預測消費深度。

  • 最後,播放器仍保留之前的一級緩存,並作爲最高優先級進行下載;所有的一級緩存都下載完成後,根據預測的消費深度調整二級緩存的大小,如果該條視頻會重度消費,則開啓二級緩存,否則放棄二級緩存。

這個方案目前還在實驗中,後續我們也將持續探索機器學習在播放上的其他應用。

圖片

體驗優化的效果需要被準確、客觀的衡量,並且能準確反映用戶的真實體驗。

在起播環節,我們設計了兩個P0指標,即首幀耗時和失敗率,同時,我們也設計了若干個p1指標,包括緩存大小、緩存命中率、預渲染命中率,下載速度等,這些指標的波動直接會影響到P0指標。

在視頻播放環節,我們設計了卡頓率、卡頓時長以及seek卡頓等P0指標,同時,設計了百秒卡頓時長、百秒卡頓次數、緩存利用率等p1指標作爲對P0指標的補充。

基於以上指標以及視頻基礎信息、預加載預渲染策略信息,我們設計並上線了分層監控系統,自上往下共分爲4個層級

  • P0指標:包括開播耗時、卡頓率等,這些是我們最爲關注的核心指標

  • P1指標:作爲對P0指標拆解和補充

  • 策略指標:包括預加載開啓率、命中率、預渲染開啓率、命中率,這兩個策略對播放體驗的影響比較明顯

  • 最後一層是視頻基礎信息,包括碼率、時長、畫質分等,這些指標也會影響到核心性能指標

圖片

三、成本優化

前面介紹了我們短視頻在播放體驗方面所做的一些努力,經過前述的這些優化,目前我們短視頻的播放流暢度已經達到行業內的一流水平。而隨着業務的不斷髮展,播放的成本也隨之水漲船高,成爲業務必須要應對處理的首要問題,接下來將和大家分享下我們在播放成本優化方面的一些思考及實踐方案。

3.1 成本拆解

首先,我們先了解下播放成本包含了哪些成本。它主要是由CDN成本、存儲成本以及進行轉碼壓縮等所需要的計算成本組成,而這裏面CDN成本佔了總成本的80%左右,是最大的一個成本來源,所以,接下來我們的分享主要是圍繞如何降低CDN成本展開。

要知道怎麼進行CDN成本的降低,就需要了解哪些是影響CDN成本的重要因素。如下圖所示:

圖片

 

  • 第一層拆解,CDN成本 = 單價x用量,這個相信大家都能很好理解。

  • 第二層的拆解,正常情況下,用量=用戶實際播放的視頻時長乘以視頻的碼率,而前面我們也介紹過,爲了提升視頻播放的起播速度,降低播放過程中的卡頓率,我們會對視頻進行預加載及預緩衝,那這部分量可能最後用戶並沒有產生播放行爲,也就造成了流量的浪費。因此我們引出了流量利用率的概念,在後續還會詳細介紹。這裏我們需要知道的是CDN實際計費的用量=用戶播放的時長x碼率除以流量利用率。

那現在有4個最基礎的因素會影響成本,分別是單價、時長、碼率、流量利用率,其中時長是業務追求的增長目標,無法用以降本,因此其他三個因素就成了我們重點優化的方向,它們分別是。

  • 尋找方案降低單價

  • 對視頻碼率進行極致壓縮

  • 對利用率進行治理提升流量利用率

在正式介紹我們的降本方案之前,我們還需要先思考一個問題:成本的降低往往帶來的是服務質量的降低,我們需要如何才能在保證播放體驗的同時,降低播放成本,也就是大家經常討論的,如何做到體驗與成本的非零和博弈。

3.2 單價降低

本小節將爲大家介紹我們的第一個降本方向,CDN單價的降低。

3.2.1 引入PCDN

我們的第一個方案是引入單價更低的PCDN技術,PCDN是目前一種新興的內容分發網絡,其主要是利用路由器、小盒子等廉價的邊緣設備代替標準CDN的邊緣節點,由於接入設備及接入網絡更加廉價,故而成本相對於標準CDN,要低很多。

其網絡架構如下圖所示,APP通過SDK訪問PCDN的邊緣節點,如果內容熱度值低,PCDN節點中沒有該視頻的緩存,則返回302狀態碼給到客戶端,客戶端再去訪問標準CDN獲取資源,當視頻熱度達到一定閾值時,PCDN會去標準CDN上回源獲取對應的視頻資源向客戶端提供服務。

圖片

從這裏我們可以看到,PCDN的節點性能相比標準CDN更差,而訪問時會有一定機率進行302跳轉,增加了鏈路的耗時,所以必然會對視頻播放時的起播速度和卡頓率造成較大的影響。

對此,我們制定了多個優化措施,來降低播放體驗的受損情況,在成本和體驗之間進行平衡。

(1)播放器策略優化

圖片

第一個優化點是通過播放緩衝水位去控制是否走PCDN,在視頻起播時使用高性能的標準CDN進行分片下載,而只有當前視頻的緩衝數據達到閾值後,才使用PCDN進行下載,利用緩衝視頻的時長,可以有效抵消PCDN的鏈路耗時增加。

第二個優化點是,在視頻起播階段發送1字節的探測包到PCDN節點,以此來確定PCDN節點上是否存在對應的視頻內容,不存在時則後續分片都從標準CDN拉取,存在的話後續再走PCDN,這樣可以大大減少302跳轉發生的概率。

經過以上兩個優化後,引入PCDN對我們的播放體驗已基本不會產生負面影響了。以此,我們達到了保證播放體驗的同時,降低了CDN成本的目的。

(2)業務策略優化

圖片

由於PCDN節點服務的主要是熱點視頻,因此我們對熱點分發的場景進行了梳理,對這些場景用到的視頻提前預熱到邊緣節點。由於做了預熱,PCDN節點提前緩存了相關視頻,出現302跳轉的概率進一步減少,因此我們可以適當降低緩衝水位的閾值,提前請求到PCDN節點。基於此方案,我們做了相關的A/B實驗,實驗的結果是,我們在保證QoE不變的情況下,提升了PCDN的分享率,即,會有更多的流量走到PCDN節點上,進一步降低了CDN成本。

當前我們PCDN分享率在46%左右,在探測成功後,只有1%以內的流量會出現302跳轉,基本可以忽略不計。通過線上長期實驗組的觀測,卡頓率和起播耗時上下波動,無顯著負向。

以上是我們進行單價降低的第一個方案,接入PCDN,接下來我們看下另外一個方案

3.2.2 共享閒時帶寬

行業內CDN計費的方式有多種,包括流量計費,峯值帶寬計費等,對於峯值帶寬計費,是以每天的帶寬最高點作爲計費值的,這種計費方式,對於持續穩定的流量會更加合適。而我們短視頻是一個用戶實時消費視頻的應用,訪問熱度會有明顯的波峯和波谷,比如中午大家休息的時候以及下班的時候會有更多的時間去看視頻,而夜裏睡覺時,業務的流量則相對較低。正常情況下我們CDN的帶寬波形如下圖所示,可以看到閒時我們的帶寬是很低的,造成了很大的浪費。

圖片

針對此種情況,我們和公司內其他業務進行合作,引入了他們的流量進行填谷,共享了我們的閒時帶寬。可以看到填谷後,藍色區域的比重明顯增加了很多,其他業務會針對這部分流量進行成本分擔,因此相當於降低了我們的成本單價。通過上述的PCDN及共享閒時帶寬,CDN的單價得到了大幅的降低,從而有效節省了CDN成本,是我們進行降本的重要手段。

3.3 極致壓縮

接下來,是我們降本的第二個方向,對視頻進行極致的壓縮從而降低視頻的碼率。

我們當下遇到的問題是:一個視頻的清晰度是和碼率強相關的,而爲了達到相同的清晰度,不同內容場景的視頻所需的碼率是不一樣的。

先前,爲了保證用戶的播放體驗,減少低質視頻的出現,我們設置的碼率標準較高,導致很多視頻沒有得到有效的壓縮。

在解決這些問題時,我們面臨着這樣幾個困難

  • 第一是內容庫中有千萬量級的視頻內容,內容量非常大;

  • 第二是這些視頻場景非常複雜,千變萬化;

  • 第三則是這些原始視頻的質量也是參差不齊的。

爲了能夠在這樣的情況下進行成本優化,我們需要根據視頻的內容特徵,自適應調整編碼參數,在保證視頻清晰度的前提下,對視頻進行極致壓縮。

接下來,來看下我們是如何做的。

圖片

首先我們基於神經網絡,自研了一套內容自適應編碼算法。算法模型的訓練過程如下:首先第一步我們會根據內容庫中的場景標籤,從內容庫中收集足夠大視頻數據集作爲模型的訓練數據。

然後對訓練集中的視頻進行不同比例的壓縮轉碼作爲Ground Truth,再對壓縮後的視頻提取特徵,這些特徵包括視頻的複雜度特徵、碼率信息、畫質特徵、碼流特徵等;最後利用上述特徵,進行神經網絡擬合訓練,得到視頻質量與壓縮率的關係模型,該模型可以預測壓縮比例和視頻壓縮質量之間的對應關係曲線。

圖片

上圖展示的是我們模型的預測效果,白色弧線是視頻在經過不同比例壓縮後得到的VMAF曲線,是實際的Ground Truth,而藍色曲線則是我們模型的預測曲線,可以看到預測曲線和Ground Truth非常接近。於是,我們便可以通過預測曲線,在保證清晰度一致的情況下,確定不同視頻需要的編碼參數,達到內容自適應編碼的目的。

最後再來看下我們極致壓縮的完整流程

圖片

 

  • 首先第一步是對視頻進行前置增強處理,這一步處理的目的是提升原始視頻的畫質,從而可以抵消一部分視頻編碼帶來的損傷,另外去除噪聲等退化也有利於壓縮過程中降低視頻的碼率。

  • 在經過增強修復後,需要對視頻進行場景劃分,一個視頻可能包含多個場景,這些場景所需要的編碼參數也不一樣,通常我們稱之爲Per-title分場景編碼,更細粒度的選擇不同的編碼參數對視頻進行壓縮。

  • 第三步就是對每一個場景的視頻提取視頻特徵,通過我們的自適應模型決策出最佳的編碼參數,進行編碼合成,最後得到輸出視頻。

通過這幾步的處理,我們的壓縮率相比之前有了大幅度的降低,通過線上的數據統計,我們的平均壓縮率從60%降低到了40%,可以看到這個優化效果非常明顯,以上就是我們極致壓縮的方案,通過進一步壓縮碼率,降低我們的CDN成本。

3.4 利用率治理

我們的最後一個優化方向是利用率治理

先解釋下什麼是流量利用率:在播放過程中,爲了提升播放的流暢度,需要提前去緩存當前視頻以及預加載後面的視頻,同時網絡層也會有socket的buffer,用戶如果使用不到這些流量,那就會產生流量浪費,這些浪費的流量與用戶實際播放的流量相加,就是CDN實際產生的流量,流量利用率就等於實際播放的流量除以CDN實際產生的流量。

由此可見,在整個播放鏈路上,都存在流量的浪費,而我們希望通過利用率的治理,控制並減少這些浪費的產生。

圖片

3.4.1 利用率漏斗建設

我們需要治理的第一個問題是:在版本迭代的過程中,播放的策略也是在不斷優化的,比如我們可能爲了體驗着想,增加了預加載的數量,或者做了多級預加載。但是在做這些優化的時候,我們無法有效的衡量每個優化究竟對CDN成本帶來了多大的變化,會不會增加流量的浪費。

對於這個問題,我們的解決方案是,針對每個版本,建立了如下圖所示利用率漏斗,並加入到了灰度報告中,嚴格監控每個版本出現的流量浪費情況,防止播放策略優化導致CDN成本大幅增加。

圖片

3.4.2 利用率提升

我們需要治理的第二個問題是:對於預加載或者預緩衝等策略,我們都會設置一個上限閾值,保證體驗的同時防止消耗過多流量,但是這個閾值一直都是以我們工程師的經驗設置的,無法確切的知道這個閾值是否合理。

針對這個問題,我們的治理方案是,通過前述建立的漏斗數據,針對閾值進行線上A/B實驗,通過收集不同閾值下體驗和成本的變化數據,找到投產比拐點,從而確定最優閾值。

圖片

3.4.3 治理效果

這邊展示了我們治理後的效果

(1)首先在治理前,如下圖左側顯示,有兩個突刺點,這是因爲某些版本優化時,沒有識別到成本的增長量級,並且在灰度期間無法明顯看出成本的變化,及時止損,最終導致我們的CDN帶寬大幅增長。而在治理後,可以看到,我們的帶寬變得平穩很多,不再出現突刺點,帶寬突增問題得到了有效。

(2)其次,如下圖右側所示,在治理前,我們的流量利用率在60%左右,而在治理後,我們在保證體驗不受損的情況下,將利用率提升到了70%,從而節省了相應的CDN成本。

通過對流量利用率的監控和治理,我們可以清晰的掌控播放鏈路中每個節點可能產生的流量及帶寬情況,找到成本優化點,降低我們的CDN成本。

圖片

四、總結&展望

如下圖所示,可以看到我們的優化結合了大數據、A/B實驗、AI技術等,通過對這些技術的應用,我們進行了播放體驗和播放成本兩個方面的優化。

圖片

  • 首先是對播放體驗優化,我們依次從網絡層、播放層、應用層進行了相關的策略優化,這裏面主要包括分片下載、預加載/預渲染、分級緩存等策略。

  • 其次是播放成本的優化,我們分別從單價、碼率、利用率等方向進行了降本,這裏面主要包括PCDN、極致壓縮、利用率治理等方案。

這些優化方案,是我們短視頻團隊長時間的實踐積累,幫助我們在體驗和成本之間做到了雙贏。

圖片

最後是我們未來的一些展望,我們會持續聚焦音視頻前沿技術,在壓縮編碼方面,我們會去研究引入H266技術,進一步壓縮視頻的碼率,而在增強方面,我們會對端側增強技術進行預研,通過端雲協同增強,進一步做到降本增效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章