流媒體技術優化

文章目錄

    • 1、下載策略優化
      • CDN選擇策略
      • 錯誤處理策略
      • 碼率選擇策略
    • 2、協議和架構優化
      • HTTP2
      • TCP變種擁塞控制
      • QUIC
      • 架構

流媒體協議的選擇與分發體系架構的設計對優化起著關鍵作用。

HLSDASH協議在點播和OTT直播服務中已逐漸占據主流,其思想主要是將視頻轉為不同碼率切為較小的片段,將流媒體分發從服務器推送轉向客戶端以HTTP下載方式獲取,在此情境下,客戶端下載策略是技術優化的重點,主要集中的方面:

  • 1、視頻鏈路的選擇和切換策略
  • 2、視頻下載的預請求、并發策略和錯誤處理策略
  • 3、視頻碼率的選擇和切換策略

1、下載策略優化

早先視頻服務的下載策略多由工程師憑經驗設置,基于IF…ELSE…構造邏輯,但隨著各家公司工程水平的提高,許多團隊開始使用較復雜的算法作為下載策略,以爭取QOS上出色的表現。

當前通用的做法是將策略組件化,且針對不同平臺和場景使用不同的算法,持續上線A/B測試并觀察數據表現,根據結果進行頻繁迭代。

CDN選擇策略

對于流量方面,常見的做法是將大部分流量由自有CDN提供,少部分流量由第三方CDN承擔,作為削平峰值的手段。小公司無自建CDN,往往使用幾家不同的CDN并將流量在其間調配,這樣做的好處是:

  • 一則避免路徑鎖定;
  • 二則保障流量安全;
  • 三則可對服務質量有所比較,汰弱留強。

自建CDN的流量調配,其策略通常是在知曉用戶的地理位置網絡狀況后,結合節點的位置負載情況,按規劃問題求解。

在混合架構下,既然客戶端進行播放時有多個CDN可供選擇,與多CDN的情況下所依據的信息較少,大多數第三方CDN并不允許指定邊緣節點,視頻服務將動態監控不同情況用戶(可依據地理位置,網絡狀況等特征分類)在某CDN獲取服務的質量,并據此推斷特定用戶應由哪個CDN服務

下圖是多CDN切換邏輯:

在這里插入圖片描述

流量調配可以具備多種策略并能在不同策略件平滑地進行切換,如基于成本的策略、基于質量最優的策略、基于ISP的策略等,其中或許還需要更多約束條件,例如調配一定數量的請求,保證所有CDN均處于緩沖完備的狀態。

錯誤處理策略

在視頻播放期間發生某一碼率的下載失敗時,優先嘗試較低碼率下載或可解決問題,若所有碼率的片段均不能正常下載,可嘗試播放前方的片段。當源站的流媒體服務正常,但用戶在某一個CDN無法正確獲得服務時,轉向另一CDN提供的資源可以讓播放繼續。倘若遇到特殊情況,如下載速度非常緩慢,帶來多次緩沖,卻并未失敗,則需要跟蹤下載進度,并為何時放棄切換下載目標CDN的判定設定合理規則

對于直播來說,錯誤處理的方式要更加細致。

若我們對丟失的視頻片段簡單跳過,將導致播放位置過于靠近Edge,從而帶來大量短促的緩沖。解決方法是:除了設置恰當的緩沖長度外,還可以使用特別的視頻片段(如無節目片段)卻帶丟失的片段。

碼率選擇策略

為追求更高的視頻質量、較低的緩沖次數和時長,給予用戶清晰流暢的觀看體驗,一個好的ABR(Adaptive Bitrate,即碼率自適應)算法非常重要。

ABR技術理論上可以構建在任何支持多碼率的流媒體協議之上。

下面是一個會話中碼率動態切換的示意圖:

在這里插入圖片描述

ABR算法設計的出發點有基于帶寬估計基于緩沖區長度混合帶寬估計和緩沖區長度等方向,代表性算法包括:

  • 移動平均線:移動平均線,即將段時間內的數值連成曲線,用來顯示歷史波動情況,當有多條不同區間的移動平均線,且平均線之間發生穿越時,可被視為超勢發牛變化的信號。
  • 卡爾曼濾波:Kalman Filter即卡爾曼濾波,算法基于隱馬爾可夫模型,能從一系列不完全及包括噪聲的信息中估計動態系統的狀態,它根據各個指標在不同時間下的值考慮其聯合分布,再產生對未知量的估計,算法常用于航空航天技術的導航空制和機器人的運動規劃等領域,廣義的卡爾曼濾波算法包括擴展卡爾曼濾波和無損卡爾曼濾波等。
  • CS2P:C2SP又稱Cross Session Stateful Predictor,是在iQiyi數據的基礎上提出的利用HMM模型進行預測的算法。
  • BOLA:BOLA,是基于緩沖區長度估計使用Lyapunov優化的一種算法,在Github上有開源的參考實現。
  • MPC:MPC,即Model Predictive Control,是種綜合帶寬估計和愛沖區長度的算法。

下面是Netflix的ABR算法

在這里插入圖片描述

2、協議和架構優化

HTTP2

HTTP2已得到大部分CDN公司、瀏覽器、反向代理的支持,眾多視頻網站也在逐步推進中。HTTP2沒有改動HTTP的語義,但包含了大量新特性,如對HTTP頭進行數據壓縮服務器端推送請求Pipeline化對數據傳輸采用多路復用等。

建立TCP連接的耗時常常達到數百毫秒,HTTP2將TCP連接分為若干個流,每個消息由若干最小的二進制幀組成,對新頁面加載的加速十分明顯。協議引入HPACK算法,令客戶端與服務器維護相同的靜態字典和可添加內容的動態字典,以哈夫曼編碼減小頭部大小。HTTP2引入的服務器端推送,允許服務器提供瀏覽器渲染頁面所需的資源,無須瀏覽器收到并解析頁面之后重行請求,同樣節約了加載時間。

TCP變種擁塞控制

TCP協議的擁塞算法常年為人詬病,當網絡存在丟包時,TCP連接速率將被大幅度調低,若丟包并非由持續存在的因素導致,實質導致了對帶寬的巨大浪費。

(TCP擁塞控制算法與路由器中的主動隊列管理(AQM)模型息息相關,路由器中簡單的隊尾丟棄方案存在多種問題,如果增加預測環節,使得緩存耗盡前有計劃地丟棄一部分分組,提早通知發送方降低速率,這就是AQM地核心思想。TCP的擁塞控制大致可以分為基于丟包反饋的協議,如Tahoe Reno、HSTCP、CUBIC等;基于路徑延遲反饋的協議,如Vegas、FAST TCP、Westwood等;基于顯式反饋的協議,如ECN、XCP等)

Serverspeeder(即銳速)是常用的TCP網絡加速軟件,可在Linux、Windows服務器上使用,不論網站,還是CDN節點,均可借此大幅提高網絡傳輸速度。另一個知名的優化方式是Google非官方提出的BBR算法,它在RTT(往返時延)增大的時候并非馬上降速,而是保持最近的最大速率進行發送,且在有空閑帶寬時加速搶占,但缺陷是減速收斂較慢,也并不適合深隊列的情形。

QUIC

使用QUIC協議而非TCP協議是近年來一些公司的嘗試,這是一個由Google倡導并正在標準化的,構建于UDP協議之上的傳輸層協議,并可能得到DASH協議的支持,其設計旨在:

1、減少握手數據包、

2、支持前向糾錯FEC(FEC即Forward Error Correction,前向錯誤更正,通過增加元余信息,在發生錯誤時,無須通知發送方重發即問進行錯誤恢復,用于流媒體傳輸時,可將N個音視頻包異或得到新包插入流中,代價是流的大小變為(N+1)/N倍。)

3、支持會話的快速重啟并行下載

最近被重命名為HTTP3。

QUIC協議在快速連接弱網狀態下的下載速度、網絡類型切換時連接的保持等方面都頗有優勢

架構

對于點播和直播,在CDN的邊緣節點上予以緩存是提升包括啟動時間在內的傳輸性能的首要步驟。

對于CDN而言,根據熱點預測將視頻的初始片段(一個完整的GOP)預先緩存到和邊緣服務器僅為常規手段,視頻網站可以根據數據預測的結果將熱門節目的完整內容主動加入緩存。

此外,由于長視頻模式的服務通常版權節目數量不過百萬級,若條件允許,可于所有節點服務器中維持持久化的緩存,至少囊括冷門視頻在內所有節目的起始片段,以此提高用戶體驗,在存儲成本低廉的當下十分劃算。

在自建CDN的場景下,無疑可以從數據預測所有內容的訪問熱度以及根據用戶確認訪問的分布,按照預測結果進行預熱。由于每個視頻均存在不同碼率,此時將各碼率內容視為不同的文件預測可能得到更好的結果,理論上,可以將節目片段的觀看熱度、電影的宣發計劃等均納入考量。在規模較大的視頻服務商的體系中,約束條件可能還包括在不同的子集群的狀態是否健康,子集群和整體的流量是否平衡。

對OTT直播節目來說甚至不需要以上步驟,將頻道主動推送至邊緣節點,而非待用戶請求再自源站拉取,就可以改善首批用戶的體驗,并降低延時。

完整的播放請求中,資源獲取、鑒權等工作通常需要訪問源數據中心,對啟動時間等指標存在多重影響,在自建CDN場景中,許多服務均可被前移至邊緣節點予以加速,常見的如轉碼服務,在直播場景下節目流上傳的節點不需要設置為源站,而可以在任意邊緣節點接收、轉碼、再行分發,如果進行得當的設計,DRM許可、廣告投放等服務也并非不能部署在邊緣站進行加速。

在游戲、秀場直播場景下,當前仍由非HTTP協議占據主流,視頻傳輸以RTP或相似的協議為主,網絡層協議選擇UDP,由于UDP的非可靠性,此時對丟包可采用FEC或帶外重傳的方式。在傳輸過程中,由于大于MTU[插圖]的包將導致IP層分片傳輸,通常的策略是將音視頻幀按略小于MTU的大小切分成RTP包,有些公司認為路由器存在小包優先的策略,因而在擁塞嚴重的網絡環節下對切分上限設置在靠近MTU除以2的位置對傳輸較為有利。

與HLS或DASH播放時,對直播視頻片段來說,若無法下載,則嘗試其他碼率或下一片段相似,在RTP環境下,服務端應監控傳輸狀況,主動切換合適的碼率,丟棄超時的幀乃至整個GOP,播放器也應在緩沖區過長的情況下采用丟幀方法追趕進度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376528.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android——android必看 各個控件屬性(網上看到的文字,覺得挺好的,珍藏了)...

屬性 值 說明 Android:orientation horizontal/vertical 設置布局水平還是垂直,默認是垂直 android:checked true/false 標記默認選中,如果是單選則選中最后一個 android:layout_gravity center/right/left/bottom/top 位置 android:gravity…

java中接口的定義與實現

1、定義接口 使用interface來定義一個接口。接口定義同類的定義類似,也是分為接口的聲明和接口體,當中接口體由常量定義和方法定義兩部分組成。定義接口的基本格式例如以下: [修飾符] interface 接口名 [extends 父接口名列表]{ [public] …

API設計筆記:pimpl技巧

pimpl pointer to implementation:指向實現的指針,使用該技巧可以避免在頭文件暴露私有細節,可以促進API接口和實現保持完全分離。 Pimpl可以將類的數據成員定義為指向某個已經聲明過的類型的指針,這里的類型僅僅作為名字引入&am…

C++必讀書

C必讀書 《Inside The C Object Model》 《Effective C》和《More Effective C》以及《Exceptional C》 《C面向對象高效編程(C Effective Object-Oriented Software Construction)》 《面向對象軟件構造(Object-Oriented Software Construction)》 《設計模式(Design Patterns…

python socket編程實現的簡單tcp迭代server

與c/c socket編程對照見http://blog.csdn.net/aspnet_lyc/article/details/38946915 server: import socketPORT 9999 BACKLOG 5 MAXLINE 1024listenfd socket.socket(socket.AF_INET,socket.SOCK_STREAM) listenfd.bind((,PORT)) listenfd.listen(BACKLOG)w…

API設計筆記:抽象基類、工廠方法、擴展工廠

文章目錄抽象基類、工廠方法擴展工廠抽象基類、工廠方法 renderer.h #ifndef UNTITLED_RENDERER_H #define UNTITLED_RENDERER_H#include <string> class IRenderer { public:virtual ~IRenderer() {}virtual bool func1(const std::string& filename) 0;virtual …

《設計模式》-責任鏈模式

責任鏈模式是一種對象的行為模式【GOF95】。在責任鏈模式里&#xff0c;很多對象由每一個對象對其下家的用而鏈起來形成一條鏈&#xff0c;請求在這個鏈上傳遞&#xff0c;直到鏈上的某一個對象決定處理此請求。 發出請求的客戶端并不知道鏈上的哪一個對象終處理這個請求&#…

ASPX的Timer位置沒放正確,導致整頁刷新,而不是UpdatePanel里的內容刷新。

提示&#xff1a;Timer應該放在UpdatePanel的ContentTemplate標簽里&#xff0c;才行。放在外面的話&#xff0c;會導致整頁刷新。轉載于:https://www.cnblogs.com/xxxteam/p/3209522.html

高性能隨機數:mt19937、uniform_int_distribution使用

// 例如要隨機獲取一個vector中的元素 // 先對vector nums進行插入數據 .... // 使用高性能隨機數 mt19937 gen; // mt19937頭文件是<random> 是偽隨機數產生器&#xff0c;用于產生高性能的隨機數 uniform_int_distribution<int> dis(0, nums.size() - 1); //uni…

【機器學習】EM最大期望算法

EM, ExpectationMaximization Algorithm, 期望最大化算法。一種迭代算法&#xff0c;用于含有隱變量(hidden variable)的概率參數模型的最大似然估計或極大后驗概率估計&#xff0c;其概率模型依賴于無法觀測的隱變量。 經常用在ML與計算機視覺的數據聚類領域。 EM應用&#xf…

ModuleNotFoundError: No module named ‘_ctypes‘報錯解決

1、python3的安裝與卸載 先刪除現有的python3 https://codeantenna.com/a/Ys0TCtmqIJ 2、關于ctypes的報錯問題解決 安裝庫后&#xff0c;重新編譯python ModuleNotFoundError: No module named _ctypeshttps://www.jianshu.com/p/69681655309b 問題解決

做一個給自己手機免費發送“天氣預報”信息的軟件

實現一個以下截圖這樣的功能&#xff01;沒錯&#xff0c;就是你手機可以收到“免費”的天氣預報短信&#xff01; 一、在做之前必須了解以下四個功能&#xff1a; 1、WebService 2、Quartz.Net&#xff08;定時任務框架&#xff09; 3、SMTP&#xff1a;簡單郵件傳輸協議,它是…

《拾牙慧者博客檢索指南》

本指南主要概括一下我的博客所涉及到的一些方面&#xff0c;以及給出每個專欄的索引&#xff0c;方便以后自己以及他人的查找相關文章。 專欄總覽《春秋招面經》《基礎技術棧》《數據庫學習筆記》《嵌入式編程經驗》《圖像處理與計算機視覺經驗》《機器學習筆記與數學》《算法與…

Android_Chronometer計時器

最近做一個項目用到Handler 和Message &#xff0c;開始時不是很明白&#xff0c;不了解其中的內部機制&#xff0c;所以開發起來有點難度&#xff0c;之后自己找了Android 時間服務 這一節的內容&#xff0c;總結了一點關于時間的知識&#xff0c;在這里大概寫一下&#xff0c…

補碼

3&#xff0e;經常使用數值編碼 因為機器數在計算時&#xff0c;假設符號位和數值位同一時候參與運算&#xff0c;則可能會產生錯誤結果&#xff1b;而假設單獨考慮符號問題&#xff0c;又會添加運算器件的實現難度。因此&#xff0c;為了使計算機可以方便地對數值進行各種算術…

置頂 | wolai博客

最近用wolai記錄筆記較多&#xff0c;這里放一下我wolai的地址&#xff0c;當然csdn這邊也會同時更文。 hanhan的博客

深入研究Clang(四) Clang編譯器的簡單分析

作者&#xff1a;史寧寧&#xff08;snsn1984&#xff09;首先我們確定下Clang編譯器的具體內容和涵蓋范圍。之前在《LLVM每日談之二十 Everything && Clang driver 》中曾經提到過&#xff0c;Clang driver&#xff08;命令行表示是clang&#xff09;和Clang前端&…

Expression Trees 參數簡化查詢

ASP.NET MVC 引入了 ModelBinder 技術&#xff0c;讓我們可以在 Action 中以強類型參數的形式接收 Request 中的數據&#xff0c;極大的方便了我們的編程&#xff0c;提高了生產力。在查詢 Action 中&#xff0c;我們可以將 Expression Trees 用作參數&#xff0c;通過自定義的…

為你的程序添加監聽器

平時在寫程序時經常會遇到監聽器&#xff0c;比如按鈕的click監聽器&#xff0c;按鍵監聽器等等。而android中的監聽器和java中的回調函數是同一個概念&#xff0c;都是在底層代碼中定義一個接口來調用高層的代碼。那么什么是回調函數呢&#xff1f;網上說的是“在WINDOWS中&am…

圖像處理

android圖像處理系列之四&#xff0d;&#xff0d;給圖片添加邊框&#xff08;上&#xff09; http://www.oschina.net/question/157182_40586 android圖像處理系列之六&#xff0d;&#xff0d;給圖片添加邊框&#xff08;下&#xff09;&#xff0d;圖片疊加 http://www.osc…