????????SRT(Secure Reliable Transport)是一種開源的視頻傳輸協議,專為高丟包、高延遲網絡環境設計,結合了UDP的低延遲和TCP的可靠性,廣泛應用于直播、遠程制作、視頻會議等場景。
-
定位:SRT協議的官方C/C++實現庫,由Haivision和社區維護,提供高可靠、低延遲的流媒體傳輸能力。
-
核心功能:
-
支持SRT協議的全部特性(ARQ重傳、FEC、AES加密、自適應碼率)。
-
跨平臺(Windows/Linux/macOS),提供C API和C++封裝。
-
與FFmpeg、GStreamer等主流多媒體框架集成。
-
1. SRT的核心優勢
特性 | 描述 |
---|---|
低延遲 | 基于UDP,支持端到端延遲可控制在?100ms~500ms(可配置)。 |
抗丟包 | 通過ARQ(自動重傳請求)和FEC(前向糾錯)恢復丟包,支持?30%+ 丟包率。 |
安全性 | 內置AES加密(128/256位),防止數據竊聽。 |
自適應碼率 | 動態調整發送速率,避免網絡擁塞。 |
多路復用 | 支持單端口多流傳輸,降低資源占用。 |
2. SRT的工作原理
(1) ARQ(自動重傳請求)
-
丟包檢測:接收端通過序列號檢測丟包,發送NACK(丟包重傳請求)。
-
選擇性重傳:僅重傳丟失的包,而非全部數據,減少帶寬浪費。
-
重傳超時:可配置超時時間(默認250ms),超時后放棄重傳,避免延遲累積。
(2) FEC(前向糾錯)
-
可選功能,在數據包中加入冗余信息,允許接收端直接恢復少量丟包(無需重傳)。
(3) 自適應傳輸
-
帶寬探測:持續監測網絡帶寬,動態調整發送碼率。
-
延遲控制:通過緩沖區(Latency Buffer)平滑網絡抖動,保持穩定延遲。
3. SRT的典型應用場景
場景 | 配置建議 |
---|---|
直播推流 | 使用?SRT + FEC,碼率自適應(如5Mbps動態調整),延遲設為1秒。 |
遠程制作 | 低延遲模式(200ms),啟用AES加密,保證實時性和安全性。 |
跨國傳輸 | 啟用ARQ和FEC,設置冗余包比例10%~20%,對抗高丟包。 |
企業視頻會議 | 使用SRT多路復用,單端口傳輸多路視頻,降低防火墻配置復雜度。 |
4. SRT vs. 其他協議
協議 | 延遲 | 可靠性 | 適用場景 |
---|---|---|---|
SRT | 低 | 高(ARQ+FEC) | 直播、遠程制作、高丟包網絡 |
RTMP | 中 | 中(TCP) | 傳統直播推流 |
WebRTC | 極低 | 中(部分丟包) | 實時通信、P2P場景 |
QUIC | 低 | 高(多路復用) | HTTP/3流媒體 |
5. SRT的配置與使用
(1) 常用參數
參數 | 說明 | 示例值 |
---|---|---|
latency | 端到端最大延遲(毫秒) | 1000 |
passphrase | AES加密密鑰(需16/24/32字符) | MySecureKey123 |
fec | FEC冗余配置(如rows:10,cols:5 ) | rows:10 |
maxbw | 最大發送帶寬(Mbps) | 10 |
(2) 推流示例(FFmpeg)
# 推流端(Publisher)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -f mpegts "srt://接收端IP:9000?latency=500&passphrase=MyKey"# 接收端(Subscriber)
ffplay "srt://0.0.0.0:9000?latency=500&passphrase=MyKey"
(3) 工具支持
-
srt-live-transmit:官方測試工具,用于中繼或調試。
-
OBS Studio:支持SRT推流(設置→輸出→選擇SRT協議)。
-
Haivision Play Pro:SRT播放器,支持加密和低延遲模式。
6. libsrt庫編譯與配置
(1) 編譯安裝(Linux)
# 安裝依賴
sudo apt-get install cmake tclsh pkg-config# 下載源碼
git clone https://github.com/Haivision/srt.git
cd srt
./configure --prefix=/usr/local --enable-shared=ON
make -j4
sudo make install# 驗證安裝
srt-live-transmit --version
(2) Windows編譯
1)使用CMake生成VS工程(比如:VS2019):
cmake -G "Visual Studio 16 2019" -A x64 ..
2)打開生成的.sln
文件編譯ALL_BUILD
目標。
7. libsrt庫使用
(1) 創建SRT Socket(C語言)
#include <srt/srt.h>int main() {// 初始化庫srt_startup();// 創建SocketSRTSOCKET sock = srt_create_socket();if (sock == SRT_INVALID_SOCK) {fprintf(stderr, "srt_create_socket failed\n");return 1;}// 設置參數:延遲500ms,啟用加密srt_setsockflag(sock, SRTO_LATENCY, "500", sizeof(int));srt_setsockflag(sock, SRTO_PASSPHRASE, "MySecretKey123", 13);// 綁定端口(接收端)struct sockaddr_in sa = {0};sa.sin_family = AF_INET;sa.sin_port = htons(9000);sa.sin_addr.s_addr = INADDR_ANY;srt_bind(sock, (struct sockaddr*)&sa, sizeof(sa));// 進入監聽模式srt_listen(sock, 5);// 接收連接(省略事件循環)SRTSOCKET client = srt_accept(sock, NULL, NULL);// 數據傳輸...char buffer[1316]; // SRT最大有效載荷int len = srt_recvmsg(client, buffer, sizeof(buffer));// 清理srt_close(sock);srt_cleanup();return 0;
}
?(2) 發送數據
#include <srt/srt.h>
#include <iostream>int send_data(SRTSOCKET sock, const char* data, size_t len) {int ret = srt_sendmsg(sock, data, len, -1, 0);if (ret == SRT_ERROR) {std::cerr << "Send failed: " << srt_getlasterror_str() << std::endl;return -1;}return ret; // 返回成功發送的字節數
}
(3)關鍵參數配置?
參數名(Flag) | 類型 | 說明 | 推薦值 |
---|---|---|---|
SRTO_LATENCY | int (ms) | 端到端最大允許延遲 | 直播:1000~2000 |
SRTO_PASSPHRASE | string | AES加密密鑰(長度16/24/32字節) | 強制設置 |
SRTO_OHEADBW | int (%) | FEC冗余帶寬占比 | 丟包高時:20 |
SRTO_MAXBW | int64 | 最大發送帶寬(bytes/sec) | 根據網絡調整 |
SRTO_RCVSYN | bool | 接收操作是否阻塞 | 非阻塞:false |
(4)FFmpeg編譯支持libsrt
# 配置FFmpeg時加入--enable-libsrt
./configure --enable-libsrt --extra-ldflags=-lsrt
推流、播流
# 推流端
ffmpeg -i input.mp4 -c:v libx264 -preset fast -f mpegts 'srt://192.168.1.100:9000?latency=500&passphrase=MyKey'# 接收端
ffplay 'srt://0.0.0.0:9000?latency=500&passphrase=MyKey'
?(5)高級功能
? ?1)多路流復用
// 啟用多路復用(需SRT v1.5+)
srt_setsockflag(sock, SRTO_STREAMID, "#!::r=live/stream1", 18);
? ?2)自適應碼率控制
// 動態調整發送帶寬(根據網絡反饋)
int64_t available_bw = ...; // 從網絡探測獲取
srt_setsockflag(sock, SRTO_MAXBW, &available_bw, sizeof(available_bw));
? ?3)日志啟用
// 設置日志級別
srt_setloglevel(srt_logging::LogLevel::debug);// 自定義日志回調
srt_setloghandler(nullptr, [](void* p, int level, const char* file, int line, const char* area, const char* msg) {printf("[SRT] %s:%d %s\n", file, line, msg);
});
? ?4)關鍵統計信息
SRT_TRACEBSTATS stats;
srt_bstats(sock, &stats, 1);printf("丟包率: %.2f%%\n", (stats.pktLossTotal * 100.0) / stats.pktSentTotal);
printf("延遲: %d ms\n", stats.msRTT);
8. 調試與優化
-
監控丟包率:通過
srt-logs
或ffmpeg
日志查看丟包和重傳統計。 -
調整延遲緩沖區:
-
網絡穩定時減少
latency
(如500ms→200ms)。 -
高抖動時增大
latency
(如2000ms)。
-
-
帶寬自適應:設置
maxbw
為物理帶寬的80%,留出冗余。
9. 注意事項
-
防火墻/NAT穿透:確保UDP端口開放(默認10000-65535),或使用SRT的Rendezvous模式。
-
加密密鑰管理:定期更換
passphrase
,避免密鑰泄露。 -
硬件加速:使用支持SRT的硬件編碼器(如Haivision Makito X)降低CPU占用。