SRT流媒體傳輸協議小結


摘抄自Cogent的微信公衆號
https://mp.weixin.qq.com/s/3kyRZiqpfQ_CihMAAU7UmA

連接過程

握手模式

caller

作爲連接的發起者,知道對應設置Listener模式設備的公網IP地址及其監聽的UDP端口。

  1. 讓一臺設備發起建立一個點對點傳輸的SRT連接;
  2. 設備所在的網絡有防火牆,但沒有防火牆操作權限;
  3. 設備的IP地址是DHCP動態獲取的;
  4. 設備沒有固定的公網IP地址。

Listener

監聽發起的SRT請求,需要知道使用哪個UDP端口,並在這個端口一直監聽。

  1. 讓一臺設備監聽發起SRT會話的請求;
  2. 設備所在的網絡有防火牆,並且可以控制防火牆,打開需要的UDP端口;
  3. 設備直接暴露在公網環境下。

Rendezvous

兩端共同協商建立連接,基本不使用此種連接

  1. 兩臺設備所在的網絡都有防火牆,但是沒有防火牆的操作權限,如果防火牆設置了適當的工作模式(將在Section 3. SRT實際應用場景中詳細介紹),可通過此模式建立SRT會話。

參數

  1. Round Trip Time(RTT)——往返延時
    發送端發送數據後收到來自及手段的確認中間的時間差,ping命令查看

  2. RTT Multiplier(RTT倍數)

    計算SRT延時的數值,反應擁塞程度和RTT之間的關係,該值用於調整SRT延時

    SRT Latency = RTT Multiplier * RTT

  3. Packet Loss Rate(丟包率)

    丟掉的數據包占總髮包的百分比

    • Constantloss(穩定丟包)

      丟包比例基本穩定,不會出現太大波動,這是需要SRT開銷不小於理論值

      Minimum Bandwidth Overhead = 1.65 * Packet Loss Rate

    • Burstloss(爆發式丟包)

      鏈路出現大量連續丟包,丟包量大於等於SRT latency buffer(緩衝區)內緩存的數據量,要穩定傳輸,需要SRT開銷不小於理論最小值

      Minimum Bandwidth Overhead = 100 ÷ RTT Multiplier

  4. Bandwidth Overhead(帶寬開銷)

    根據網絡質量設置的百分比,和視音頻總碼率相乘,得到的值和總碼率相加即當前SRT傳輸貸款的閾值

    作用是傳輸伴隨SRT流的控制信息數據包,還有媒體數據包的重傳,開銷角度理解就是用來恢復丟包的額外開銷,需要佔用的“無效”帶寬

    這個值可以是5%~100%,默認25%。

    ffmpeg相關設置

    ​ oheadbw=percents

    ​ inputbw=byte/seconds

    其中inptbw * (100 + oheadbw) / 100

  5. Latency(延時)

    這個延時代表了可用於管理SRT數據包最大的buffer大小。

    SRT源設備的buffer會對沒有發出的數據包在內部排序,也會保存那些沒有被確認收到的數據包。

    SRT目標設備buffer會對收到的包進行排序,保存已經收到並等待解碼的數據包(16進制排序)

    如果網絡環境比較好,丟包率0.1%~0.2%,可以將RTT Multiplier取爲4

    SRT Latency = 4 * RTT

    這個參數在兩端都可以設置,最終將取兩端中值比較大的哪一個

  6. Passphrase(密碼)

    ffmpeg參數使用passphrase=string

SRT延時設置的越高,buffer中能存儲的數據就越多,可以保證一定時間內輸出解碼部分的數據流不中斷,突然丟包時,SRT源設備會使用SRT最大可用的帶寬中未使用的帶寬去傳輸丟失的數據包。

參數設置

  1. 檢測RTT值

    使用ping來查看RTT,當RTT ≤ 20ms,視RTT爲20ms

  2. 檢測丟包率

    Packet Loss Rate = Resent Bytes ÷ Sent Bytes * 100

    丟包率影響SRT Latency和Bandwidth Overhead,可以通過ipdef檢測

    本機檢測

    ​ server ------------ iperf -s -p 12345 -i 1

    ​ client ------------- iperf -c 127.0.0.1 -u -b 5.5m -i 1 -p 12345

  3. 通過丟包率,在表中查找對應的RTT Multiplier和BW Overhead值

    網絡最高丟包率 RTT Multiplier BW Overhead 最小SRT Latency(在RTT ≤ 20ms時)
    ≤ 1 3 33 60
    ≤ 3 4 25 80
    ≤ 7 5 20 100
    ≤ 10 6 17 120
    1. 其中表格內內BW Overhead爲穩定丟包和爆發丟包均考慮,取兩種情況的較大值,較大值爲100 / RTT Multiplier
    2. SRT Latency爲RTT ≤ 20ms時(RTT取值爲20ms),實際使用時應帶入實測的RTT值
    3. 表格基本代表了一般情況下最高效的SRT設置,網絡變差或者希望容錯率更高,也可以取更大的值
  4. 通過以下公式確定SRT Latency

    SRT Latency = RTT Multiplier * RTT

    當RTT ≤ 20ms,統一取20ms

  5. 測試可用鏈路帶寬

    iperf測試

  6. 確定傳輸碼率

    SRT傳輸碼率包括視頻、音頻、元數據等,加上SRT協議開銷,使用以下公式

    Channel Capacity>SRT Stream Bandwidth * (100+ Bandwidth Overhead) / 100

    如果不滿足以上公式,減小視音頻碼率知道滿足

    一般建議保留更多帶寬抵抗不斷變化的鏈路帶寬,所以下式更具安全性

    0.75 * Channel Capacity>SRT Stream Bandwidth * (100+ Bandwidth Overhead) / 100

  7. 檢查SRT傳輸參數設置是否正確

    傳輸開始後,看Send Buffer數值應該始終不超過SRT Latency的值,如果十分接近,應當適當增加SRT延時

    • 如果偶爾超過,增大SRT延時
    • 如果經常超過,需要增大帶寬
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章