直播基本原理

直播通信過程

  • 主播客戶端在分享自己的音視頻媒體流之前,首先要向信令服務器發送“創建房間”的信令
  • 信令服務器收到該信令後,給主播客戶端返回一個推流地址(CDN 網絡源站地址)
  • 此時,主播客戶端就可以通過音視頻設備進行音視頻數據的採集和編碼,生成 RTMP 消息,最終將媒體流推送給 CDN 網絡
  • 當觀衆端想看某個房間裏的節目時,要向信令服務器發 “加入房間”消息
  • 信令服務端收到該消息後,會根據用戶所在地區,分配一個與它最接近的“CDN 邊緣節點”
  • 觀衆客戶端收到該地址後,就可以從該地址拉取媒體流了

CDN網絡

img

  • 先要先在各運營商內構建雲服務,然後再將不同運營商的雲服務通過光纖連接起來,從而實現跨運營商的全網 CDN 雲服務
  • 每個運營商雲服務內部包括了多個節點,按功能分爲 3 類:
    • 源節點,用於接收用戶推送的媒體流
      • 源節點接收到媒體數據後,會主動向各個主幹結點傳送流媒體數據,這樣主幹結點就將媒體數據緩存起來了
    • 主幹結點,起到媒體數據快速傳遞的作用
      • 比如與其他運營商傳送媒體流,或者緩存源站數據
    • 過緣節點,用於用戶來主動接流
      • 一般邊緣節點的數量衆多,但機子的性能比較低,它會被佈署到各地級市,主要解決網絡最後一公里的問題

CDN就近接入

img

  • 當用戶訪問 CDN 網絡時,它首先通過智能 DNS 獲取與用戶距離最近的邊緣節點
    • 傳統 DNS 不判斷訪問者來源,當有多個 IP 地址可用時,DNS 會隨機選擇其中一個 IP 地址返回給訪問者
    • 而智能 DNS 會判斷訪問者的來源,也就是說,它會對訪問者的 IP 地址做判斷,對不同的訪問者它會返回不同的 IP 地址
      • 智能 DNS 可以根據用戶的 IP 地址找到它所在的地區、使用的運營商等。通過這些信息,它就可以讓訪問者在訪問服務的時候,獲得最優的 CDN 邊緣節點,從而提升服務的質量
  • 用戶在自己地區所在的運營商接入網絡,而跨運營商、跨地區的數據傳輸交由 CDN 網絡使用專用網進行傳輸,這樣就可以讓用戶享受到更好的音視頻服務質量了

協議

  • 一般使用RTMP推流到CDN,用戶再使用HLS協議從CDN拉流

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sJK3NlO3-1587457892205)(C:\Users\35135\Desktop\markdown\1587455638430.png)]

RTMP

  • 全稱 Real Time Messaging Protocol ,即實時消息協議

  • 但它實際上並不能做到真正的實時,一般情況最少都會有幾秒到幾十秒的延遲

  • 底層是基於 TCP 協議的

    • 在使用 RTMP 協議傳輸數據之前,RTMP 也像 TCP 協議一樣,先進行三次握手才能將連接建立起來
    • 當 RTMP 連接建立起來後,你可以通過 RTMP 協議的控制消息爲通信的雙方設置傳輸窗口的大小(緩衝區大小)、傳輸數據塊的大小等
  • 優點

    • RTMP 是專爲流媒體開發的協議,對底層的優化比其它協議更加優秀
    • 同時它 Adobe Flash 支持好,基本上所有的編碼器(攝像頭之類)都支持 RTMP 輸出
  • 缺點

    • 基於 TCP 傳輸,非公共端口,可能會被防火牆阻攔
    • 爲 Adobe 私有協議,很多設備無法播放,特別是在 iOS 端,需要使用第三方解碼器才能播放

HLS

  • 全稱 HTTP Live Streaming,是蘋果公司實現的基於 HTTP 的流媒體傳輸協議

  • HLS 協議的本質就是通過 HTTP 協議下載文件,然後將下載的切片緩存起來

  • 由於切片文件都非常小,所以可以實現邊下載邊播的效果

  • 優點

    • 而 HLS 使用的是 HTTP 協議傳輸數據,避免了防火牆攔截
    • 瀏覽器天然支持 HLS 協議,而 RTMP 協議需要安裝 Flash 插件才能播放 RTMP 流
  • 缺點

    • 實時性差
      • 由於 HLS 往往採用 10s 的切片,所以最小也要有 10s 的延遲,一般是 20~30s 的延遲,有時甚至更差
      • HLS 使用的是 HTTP 短連接,且 HTTP 是基於 TCP 的,所以這就意味着 HLS 需要不斷地與服務器建立連接
  • HLS將多媒體文件或直接流進行切片,形成一堆的 ts 文件和 m3u8 索引文件並保存到磁盤。當播放器獲取 HLS 流時,它首先根據時間戳,通過 HTTP 服務,從 m3u8 索引文件獲取最新的 ts 視頻文件切片地址,然後再通過 HTTP 協議將它們下載並緩存起來。當播放器播放 HLS 流時,播放線程會從緩衝區中讀出數據並進行播放

FLV

  • LV (Flash Video) 是一種在網絡上傳輸的流媒體數據存儲容器格式。

    • 格式相對簡單輕量,不需要很大的媒體頭部信息,因此加載速度極快
    • 採用 FLV 格式封裝的文件後綴爲 .flv
  • 由於 FLV 是流式的文件格式,所以它特別適合在音視頻錄製中使用

  • 整個 FLV 由 The FLV Header, The FLV Body 以及其它 Tag 組成

    • FLV 相較 MP4 等多媒體文件,它的文件頭是固定的,音視頻數據可以隨着時間的推移隨時寫入到文件的末尾
      • MP4 之類的文件,文件頭是隨着數據的增長而增長的,並且體積大,處理時間長
    • 這樣的文件結構有一個天然的好處,就是你可以將音視頻數據隨時添加到 FLV 文件的末尾,而不會破壞文件的整體結構
      • 在衆多的媒體文件格式中,只有 FLV 具有這樣的特點。像 MP4、MOV 等媒體文件格式都是結構化的,也就是說音頻數據與視頻數據是單獨存放的。當服務端接收到音視頻數據後,如果不通過 MP4 的文件頭,你根本就找不到音頻或視頻數據存放的位置

img

  • FLV文件本身需要flash插件才能在PC端播放
    • 目前,各大瀏覽器廠商默認都是禁止使用 Flash 插件的。之前常見的 Flash 直播方案,到現在已經遇到極大的挑戰。因爲它需要用戶在瀏覽器上主動開啓 Flash 選項之後纔可以正常使用,這種用戶體驗是非常糟糕的
  • flv.js 項目可以解析 FLV 文件,從中取出音視頻數據並轉成一種 MP4 格式,然後交給 HTML5 的<video>標籤進行播放
    • 通過這種方式,使得瀏覽器在不借助 Flash 的情況下也可以播放 FLV 文件了

參考

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