SRT協議

????????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
passphraseAES加密密鑰(需16/24/32字符)MySecureKey123
fecFEC冗余配置(如rows:10,cols:5rows: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_LATENCYint (ms)端到端最大允許延遲直播:1000~2000
SRTO_PASSPHRASEstringAES加密密鑰(長度16/24/32字節)強制設置
SRTO_OHEADBWint (%)FEC冗余帶寬占比丟包高時:20
SRTO_MAXBWint64最大發送帶寬(bytes/sec)根據網絡調整
SRTO_RCVSYNbool接收操作是否阻塞非阻塞: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-logsffmpeg日志查看丟包和重傳統計。

  • 調整延遲緩沖區

    • 網絡穩定時減少latency(如500ms→200ms)。

    • 高抖動時增大latency(如2000ms)。

  • 帶寬自適應:設置maxbw為物理帶寬的80%,留出冗余。

9. 注意事項

  1. 防火墻/NAT穿透:確保UDP端口開放(默認10000-65535),或使用SRT的Rendezvous模式。

  2. 加密密鑰管理:定期更換passphrase,避免密鑰泄露。

  3. 硬件加速:使用支持SRT的硬件編碼器(如Haivision Makito X)降低CPU占用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75833.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

“征服HTML引號惡魔:“完全解析手冊”!!!(quot;表示雙引號)

&#x1f6a8;&#x1f4e2; "征服HTML引號惡魔&#xff1a;“完全解析手冊” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;當引號變成"惡魔" &#x1f631; 是否遇到過這種情況&#xff1a; 寫HTML時滿心歡喜輸入<div title"他…

npm install 卡在創建項目:sill idealTree buildDeps

參考&#xff1a; https://blog.csdn.net/PengXing_Huang/article/details/136460133 或者再執行 npm install -g cnpm --registryhttps://registry.npm.taobao.org 或者換梯子

c++中cpp文件從編譯到執行的過程

C 文件從編寫到執行的過程可以分為幾個主要階段&#xff1a;編寫代碼、預處理、編譯、匯編、鏈接和運行。以下是每個階段的詳細說明&#xff1a; 1. 編寫代碼 這是整個過程的起點。程序員使用文本編輯器&#xff08;如 VSCode、Sublime Text 或其他 IDE&#xff09;編寫 C 源…

PROE 與 STL 格式轉換:開啟 3D 打印及多元應用的大門

在 3D 設計與制造的復雜生態中&#xff0c;將 PROE 格式轉換為 STL 格式絕非無端之舉&#xff0c;而是有著深厚且多元的現實需求作為支撐。 一、文件格式介紹? &#xff08;一&#xff09;PROE 格式? PROE 作為一款參數化設計軟件&#xff0c;采用基于特征的參數化建模技術…

開發中后端返回下劃線數據,要不要統一轉駝峰?

先說結論。看情況&#xff01;&#xff01;&#xff01;&#xff01; 前端 主要用 JS/TS 建議后端返回 camelCase&#xff0c;減少前端轉換成本。后端 主要是 Python/Go 建議保持 snake_case&#xff0c;前端做轉換。但是團隊統一風格最重要&#xff01;如果統一返回駝峰就駝峰…

docker pull時報錯:https://registry-1.docker.io/v2/

原文&#xff1a;https://www.cnblogs.com/sdgtxuyong/p/18647915 https://www.cnblogs.com/OneSeting/p/18532166 docker 換源&#xff0c;解決連接不上的問題。 編輯以下文件&#xff0c;不存在則創建&#xff1a; vim /etc/docker/daemon.json {"registry-mirrors&qu…

Pytorch學習筆記(十二)Learning PyTorch - NLP from Scratch

這篇博客瞄準的是 pytorch 官方教程中 Learning PyTorch 章節的 NLP from Scratch 部分。 官網鏈接&#xff1a;https://pytorch.org/tutorials/intermediate/nlp_from_scratch_index.html 完整網盤鏈接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取碼: …

基礎算法02——冒泡排序(Bubble Sort)

冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序&#xff1a;是一種簡單的排序算法&#xff0c;其基本思想是通過重復遍歷要排序的列表&#xff0c;比較相鄰的元素&#xff0c;并在必要時&#xff08;即前面的數比后面的數大的時候&#xff09;交換它們的位置&#xff…

RestTemplate遠程調用接口方式

1.Post(body空參) 也就是說需要給一個空的json 代碼: String getDeviceUrl this.MOVABLE_URL "detected-data/getMachineLists"; // 遠程調用 RestTemplate restTemplate new RestTemplate(); restTemplate.getMessageConverters().set(1,new StringHttpMessageC…

ar頭顯和眼鏡圖像特效處理

使用一個線程從攝像頭或者其他設備循環讀取圖像數據寫入鏈表&#xff0c;另一個線程從鏈表循環讀取數據并做相應的特效處理&#xff0c;由于寫入的速度比讀取的快&#xff0c;最終必然會因為寫入過快導致線程讀寫一幀而引發沖突和數據幀正常數據幀被覆蓋。最好使用共享內存&…

mysql--socket報錯

錯誤原因分析 MySQL 服務未運行&#xff08;最常見原因&#xff09; 錯誤中的 (2) 表示 “No such file or directory”&#xff0c;即 /tmp/mysql.sock 不存在這通常意味著 MySQL 服務器根本沒有啟動 socket 文件路徑不匹配 客戶端嘗試連接 /tmp/mysql.sock但 MySQL 服務器可…

labview加載matlab數據時報錯提示:對象引用句柄無效。

1. labview報錯提示 labview加載mat數據時報錯提示&#xff1a;對象引用句柄無效。返回該引用句柄的節點可能遇到錯誤&#xff0c;并沒有返回有效的引用句柄。該引用句柄所指的存儲可能在執行調用之前已關閉。報錯提示如下&#xff1a; 這是由于labview缺少matlab MathWorks導…

面試計算機操作系統解析(一中)

判斷 1. 一般來說&#xff0c;先進先出頁面置換算法比最近最少使用頁面置換算法有較少的缺頁率。&#xff08;?&#xff09; 正確答案&#xff1a;錯誤解釋&#xff1a;FIFO&#xff08;先進先出&#xff09;頁面置換算法可能導致“Belady異常”&#xff0c;即頁面數增加反而…

如何防御TCP洪泛攻擊

TCP洪泛攻擊&#xff08;TCP Flood Attack&#xff09;是一種常見的分布式拒絕服務&#xff08;DDoS&#xff09;攻擊手段&#xff0c;以下是其原理、攻擊方式和危害的詳細介紹&#xff1a; 定義與原理 TCP洪泛攻擊利用了TCP協議的三次握手過程。在正常的TCP連接建立過程中&a…

20250330 Pyflink with Paimon

1. 數據湖 2. 本地安裝Pyflink和Paimon 必須安裝Python 3.11 Pip install python -m pip install apache-flink1.20.1 需要手動加入這兩個jar 測試代碼&#xff1a; import argparse import logging import sys import timefrom pyflink.common import Row from pyflink.tab…

-PHP 應用SQL 盲注布爾回顯延時判斷報錯處理增刪改查方式

#PHP-MYSQL-SQL 操作 - 增刪改查 1 、功能&#xff1a;數據查詢(對數據感興趣&#xff09; 查詢&#xff1a; SELECT * FROM news where id$id 2 、功能&#xff1a;新增用戶&#xff0c;添加新聞等&#xff08;對操作的結果感興趣&#xff09; 增加&#xff1a; INSERT INT…

【學習記錄】大模型微調之使用 LLaMA-Factory 微調 Qwen系列大模型,可以用自己的數據訓練

一、LoRA微調的基本原理 1、基本概念 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一種用于大模型微調的技術&#xff0c;通過引入低秩矩陣來減少微調時的參數量。在預訓練的模型中&#xff0c;LoRA通過添加兩個小矩陣B和A來近似原始的大矩陣ΔW&#xff0c;從而減少需…

Vue 使用 xlsx 插件導出 excel 文件

安裝與引入 安裝 npm install xlsx npm install file-saver # 或者 yarn add xlsx yarn add file-saver 引入 import * as XLSX from xlsx; import FileSaver from file-saver 基本功能 讀取 Excel 文件 // 讀取文件內容 const workbook XLSX.readFile(path/to/file.xl…

vulntarget_a 訓練筆記

win 7 權限 利用任意文件上傳 getshell POST /module/ueditor/php/action_upload.php?actionuploadfile HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html) Accept: */* Accept-Language: zh-CN,zh;q0.9 Connectio…

無人機螺旋槳平衡標準

螺旋槳平衡是確保無人機(UAV)平穩運行、可靠性和使用壽命的關鍵過程。螺旋槳的不平衡會導致振動、噪音&#xff0c;并加速關鍵部件的磨損&#xff0c;從而對飛行性能產生負面影響。 ISO 21940-11:2016標準為旋翼平衡提供了一個廣泛引用的框架&#xff0c;定義了可接受的不平衡…