vivo 短影片體驗與成本最佳化實踐

發表於2024-02-22
作者:來自 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技術,進一步壓縮影片的位元速率,而在增強方面,我們會對端側增強技術進行預研,透過端雲協同增強,進一步做到降本增效。

相關文章