摘抄自Cogent的微信公衆號
https://mp.weixin.qq.com/s/3kyRZiqpfQ_CihMAAU7UmA
連接過程
握手模式
caller
作爲連接的發起者,知道對應設置Listener模式設備的公網IP地址及其監聽的UDP端口。
- 讓一臺設備發起建立一個點對點傳輸的SRT連接;
- 設備所在的網絡有防火牆,但沒有防火牆操作權限;
- 設備的IP地址是DHCP動態獲取的;
- 設備沒有固定的公網IP地址。
Listener
監聽發起的SRT請求,需要知道使用哪個UDP端口,並在這個端口一直監聽。
- 讓一臺設備監聽發起SRT會話的請求;
- 設備所在的網絡有防火牆,並且可以控制防火牆,打開需要的UDP端口;
- 設備直接暴露在公網環境下。
Rendezvous
兩端共同協商建立連接,基本不使用此種連接
- 兩臺設備所在的網絡都有防火牆,但是沒有防火牆的操作權限,如果防火牆設置了適當的工作模式(將在Section 3. SRT實際應用場景中詳細介紹),可通過此模式建立SRT會話。
參數
-
Round Trip Time(RTT)——往返延時
發送端發送數據後收到來自及手段的確認中間的時間差,ping命令查看 -
RTT Multiplier(RTT倍數)
計算SRT延時的數值,反應擁塞程度和RTT之間的關係,該值用於調整SRT延時
SRT Latency = RTT Multiplier * RTT
-
Packet Loss Rate(丟包率)
丟掉的數據包占總髮包的百分比
-
Constantloss(穩定丟包)
丟包比例基本穩定,不會出現太大波動,這是需要SRT開銷不小於理論值
Minimum Bandwidth Overhead = 1.65 * Packet Loss Rate
-
Burstloss(爆發式丟包)
鏈路出現大量連續丟包,丟包量大於等於SRT latency buffer(緩衝區)內緩存的數據量,要穩定傳輸,需要SRT開銷不小於理論最小值
Minimum Bandwidth Overhead = 100 ÷ RTT Multiplier
-
-
Bandwidth Overhead(帶寬開銷)
根據網絡質量設置的百分比,和視音頻總碼率相乘,得到的值和總碼率相加即當前SRT傳輸貸款的閾值
作用是傳輸伴隨SRT流的控制信息數據包,還有媒體數據包的重傳,開銷角度理解就是用來恢復丟包的額外開銷,需要佔用的“無效”帶寬
這個值可以是5%~100%,默認25%。
ffmpeg相關設置
oheadbw=percents
inputbw=byte/seconds
其中inptbw * (100 + oheadbw) / 100
-
Latency(延時)
這個延時代表了可用於管理SRT數據包最大的buffer大小。
SRT源設備的buffer會對沒有發出的數據包在內部排序,也會保存那些沒有被確認收到的數據包。
SRT目標設備buffer會對收到的包進行排序,保存已經收到並等待解碼的數據包(16進制排序)
如果網絡環境比較好,丟包率0.1%~0.2%,可以將RTT Multiplier取爲4
SRT Latency = 4 * RTT
這個參數在兩端都可以設置,最終將取兩端中值比較大的哪一個
-
Passphrase(密碼)
ffmpeg參數使用passphrase=string
SRT延時設置的越高,buffer中能存儲的數據就越多,可以保證一定時間內輸出解碼部分的數據流不中斷,突然丟包時,SRT源設備會使用SRT最大可用的帶寬中未使用的帶寬去傳輸丟失的數據包。
參數設置
-
檢測RTT值
使用ping來查看RTT,當RTT ≤ 20ms,視RTT爲20ms
-
檢測丟包率
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
-
通過丟包率,在表中查找對應的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 - 其中表格內內BW Overhead爲穩定丟包和爆發丟包均考慮,取兩種情況的較大值,較大值爲
100 / RTT Multiplier
- SRT Latency爲RTT ≤ 20ms時(RTT取值爲20ms),實際使用時應帶入實測的RTT值
- 表格基本代表了一般情況下最高效的SRT設置,網絡變差或者希望容錯率更高,也可以取更大的值
- 其中表格內內BW Overhead爲穩定丟包和爆發丟包均考慮,取兩種情況的較大值,較大值爲
-
通過以下公式確定SRT Latency
SRT Latency = RTT Multiplier * RTT
當RTT ≤ 20ms,統一取20ms
-
測試可用鏈路帶寬
iperf測試
-
確定傳輸碼率
SRT傳輸碼率包括視頻、音頻、元數據等,加上SRT協議開銷,使用以下公式
Channel Capacity>SRT Stream Bandwidth * (100+ Bandwidth Overhead) / 100
如果不滿足以上公式,減小視音頻碼率知道滿足
一般建議保留更多帶寬抵抗不斷變化的鏈路帶寬,所以下式更具安全性
0.75 * Channel Capacity>SRT Stream Bandwidth * (100+ Bandwidth Overhead) / 100
-
檢查SRT傳輸參數設置是否正確
傳輸開始後,看Send Buffer數值應該始終不超過SRT Latency的值,如果十分接近,應當適當增加SRT延時
- 如果偶爾超過,增大SRT延時
- 如果經常超過,需要增大帶寬