關於直播,所有的技術細節都在這裡了(轉載)

来源:http://www.cnblogs.com/vvzone/archive/2016/08/05/5739869.html
-Advertisement-
Play Games

解析優化 參見之前介紹的DNS過程,如下圖: 基於可控和容災的需要,移動端代碼一般不會hardcode 推流、播放的伺服器IP地址,而選用功能變數名稱代替。在IP出現宕機或網路中斷的情況下,還可以通過變更DNS來實現問題IP的剔除。而功能變數名稱的解析時間需要幾十毫秒至幾秒不等,對於新生成熱度不高的功能變數名稱,一般的平均 ...


解析優化

  參見之前介紹的DNS過程,如下圖:

  

  基於可控和容災的需要,移動端代碼一般不會hardcode 推流、播放的伺服器IP地址,而選用功能變數名稱代替。在IP出現宕機或網路中斷的情況下,還可以通過變更DNS來實現問題IP的剔除。而功能變數名稱的解析時間需要幾十毫秒至幾秒不等,對於新生成熱度不高的功能變數名稱,一般的平均解析延遲在300ms,按上圖的各個環節只要有一個通路網路產生波動或者是設備高負載,會增加至秒級。幾十毫秒的情況是ISP NS這一層在熱度足夠高的情況下會對功能變數名稱的解析進行緩存。如下圖:

  

  按我們上面分析的情況,本省延遲大概是15ms左右,那麼功能變數名稱解析最低也可以做到15ms左右。但由於直播場景的特殊性,推流和播放使用的功能變數名稱使用的熱度較難達到ISP NS緩存的標準,所以經常需要走回Root NS進行查詢的路徑。

  那客戶端解析優化的原理就出來了:本機緩存功能變數名稱的解析結果,對功能變數名稱進行預解析,每次需要直播推流和播放的時候不再需要再進行DNS過程。此處節省幾十到幾百毫秒的打開延遲。

  播放優化

  直播播放器的相關技術點有:直播延時、首屏時間(指從開始播放到第一次看到畫面的時間)、音視頻同步、軟解碼、硬解碼。參考如下播放流程:

  

  播放步驟描述:

  1、根據協議類型(如RTMP、RTP、RTSP、HTTP等),與伺服器建立連接並接收數據;

  2、解析二進位數據,從中找到相關流信息;

  3、根據不同的封裝格式(如FLV、TS)解復用(demux);

  4、分別得到已編碼的H.264視頻數據和AAC音頻數據;

  5、使用硬解碼(對應系統的API)或軟解碼(FFMpeg)來解壓音視頻數據;

  6、經過解碼後得到原始的視頻數據(YUV)和音頻數據(AAC);

  7、因為音頻和視頻解碼是分開的,所以我們得把它們同步起來,否則會出現音視頻不同步的現象,比如別人說話會跟口型對不上;

  8、最後把同步的音頻數據送到耳機或外放,視頻數據送到屏幕上顯示;

  瞭解了播放器的播放流程後,我們可以優化以下幾點:

  首屏時間優化

  1、從步驟2入手,通過預設解碼器類型,省去探測文件類型時間;

  2、從步驟5入手,縮小視頻數據探測範圍,同時也意味著減少了需要下載的數據量,特別是在網路不好的時候,減少下載的數據量能為啟動播放節省大量的時間,當檢測到I幀數據後就立馬返回併進入解碼環節。

  延時優化

  1、視頻緩衝區或叫視頻緩存策略,該策略原理是當網路卡頓時增加用戶等待時間來緩存一定量的視頻數據,達到後續平滑觀看的效果,該技術能有效減少卡頓次數,但是會帶來直播上的內容延時,所以該技術主要運用於點播,直播方面已去掉該策略,以此儘可能去掉或縮小內容從網路到屏幕展示過程中的時間;(有利於減少延時)

  2、下載數據探測池技術,當用戶下載速度不足發生了卡頓,然後網路突然又順暢了,伺服器上之前滯留的數據會加速發下來,這時為了減少之前卡頓造成的延時,播放器會加速播放探測池的視頻數據並丟棄當前加速部分的音頻數據,以此來保證當前觀看內容延時穩定。

  

  推流優化

  推流步驟說明:很容易看出推流跟播放其實是逆向的,具體流程就不多說了。

  優化一:適當的Qos(Quality of Service,服務質量)策略。推流端會根據當前上行網路情況控制音視頻數據發包和編碼,在網路較差的情況下,音視頻數據發送不出去,造成數據滯留在本地,這時,會停掉編碼器防止發送數據進一步滯留,同時會根據網路情況選擇合適的策略控制音視頻發送。比如網路很差的情況下,推流端會優先發送音頻數據,保證用戶能聽到聲音,併在一定間隔內發關鍵幀數據,保證用戶在一定時間間隔之後能看到一些畫面的變化。

  優化二:合理的關鍵幀配置。合理控制關鍵幀發送間隔(建議2秒或1秒一個),這樣可以減少後端處理過程,為後端的緩衝區設置更小創造條件。

  軟硬編解選擇

  網上有不少關於選擇軟解還是硬解的分析文章,這裡也介紹一些經驗,但根本問題是,沒有一個通用方案能最優適配所有操作系統和機型。

  推流編碼: 推薦Andorid4.3(API18)或以上使用硬編,以下版本使用軟編;iOS使用全硬編方案;

  播放解碼:Andorid、iOS播放器都使用軟解碼方案,經過我們和大量客戶的測試以及總結,雖然犧牲了功耗,但是在部分細節方面表現會較優,且可控性強,相容性也強,出錯情況少,推薦使用。

  附軟硬編解碼優缺點對比:

  優點

  缺點

  軟編/解碼

  1、相容性強,對系統版本要求比較低,出錯少;

  2、解碼方面,軟解的色彩一般會比硬解的色彩好;

  3、編解碼可操作空間比較大,自由度高;

  1、吃CPU,消耗會比較大

  硬編/解碼

  1、功耗低,執行效率高

  1、因不同型號的晶元對編解碼的實現會有不同,並不能保證編解碼的效果與其它機型一致或者不會出錯,可控性比較差;

  雲端機型及網路適配

  上面分析了很多針對視頻編解碼的參數,但實際情況最好的編解碼效果是需要根據機型的適配的,由於iOS的設備類型較少,可以做到每個機型針對性的測試和調優,但是對於Android就非常難做到逐款機型針對性調優,並且每年都會出產不少的新機器,如果代碼中寫死了配置或判斷邏輯將非常不利於維護和迭代。所以我們就誕生了一個想法,這些判斷邏輯或配置是否可以放在雲上呢? 這樣就產生了雲端機型與網路適配的技術。

  

  終端在推流、播放前會獲取通過協議上報當前的機型配置、網路情況、IP信息。雲端會返回一個已最適合的編解碼策略配置:走軟編還是硬編、各項參數的配置,就近推流服務的IP,就近播放服務的IP。 終端獲取一次即可,不需要每次推流、播放前都去獲取一次。

  這樣,在我們不斷的迭代和完善機型編解碼適配庫的同時,所有使用該技術的直播APP都將收益。

  總結

  分析很多直播後端、終端的關於低延遲、秒開的優化技術,在UCloud直播雲上都已有了相關的實踐,都是一些較“靜態”的技術。實際提供穩定、低延遲、流暢的直播服務,是日常中非常大量細緻的監控、演算法和動態運營的結果,並不是實現了某些的技術點,就能坐享一套穩定的直播服務,只能說是完成了萬里長城的第一道磚。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2016年8月4日,第一次開筆寫博客園,今天在公司解決了一個問題。 apache+jboss做負載均衡的問題一直困擾了很久。問題描述如下,使用apche做反向代理轉發給3台jboss 的app,app有session會話。為了跳轉不丟失session會話,需要配置。經過幾天的尋找,大概有兩種方法: ...
  • Instrumentation 類載入過程 Instrumentation與Transformer Instrumentation與Transformer的關係 Instrumentation介面簡介 觸發位元組碼轉換的途徑 Transformer分類 Transformer調度過程 Transfor ...
  • 題目鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=2955 題意 小偷有個總的逃跑概率,每個銀行有一個錢數和逃跑概率,問在總的逃跑概率下能最多獲得多少錢? 思路:開始有0-1背包寫,把概率擴大100倍,wa了,重改思路。把總價格當容量,被抓的概率為價值 在 ...
  • ...
  • 1. 關於值棧: 1). 登陸 時, ${userName} 讀取 userName 值, 實際上該屬性並不在 request 等域對象中, 而是從值棧中獲取的. 2). ValueStack: I. 可以從 ActionContext 中獲取值棧對象 //1. 獲取值棧 ValueStack va ...
  • 簡訊驗證碼 簡訊下行 簡訊下行的使用場景 簡訊驗證碼就是最常用的一個簡訊下行的例子,相對於傳統的圖片驗證碼,簡訊驗證碼最大的好處就是提升了賬號的有效性,註冊這一般都是使用自己的手機號嗎。當然了,除此之外簡訊驗證碼還可以用於登陸,方便快捷。 簡訊下行的設計 簡訊下行的驗證方式,較上行驗證碼簡單很多,這 ...
  • 一、NumPy 是什麼 NumPy 是 Python 科學計算的基礎包,它專為進行嚴格的數字處理而產生。在之前的隨筆里已有更加詳細的介紹,這裡不再贅述。 利用 Python 進行數據分析(一)簡單介紹 二、ndarray 是什麼 ndarray 是一個多維的數組對象,具有矢量算術運算能力和複雜的廣播 ...
  • 原題鏈接http://acm.hust.edu.cn/vjudge/contest/121397#problem/A 題意:t組數據,每組一個n 求 1+1/2+1/3+1/4 ......+1/n的和 方法:打表 沒100個存一個,不夠100的跑一趟 #include <iostream>#inc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...