当前位置: 首页 > news >正文

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();

    // 创建Socket
    SRTSOCKET 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占用。

相关文章:

  • 企业微信token及相关接口关联分析
  • 界面控件Telerik和Kendo UI 2025 Q1亮点——AI集成与数据可视化
  • leetcode543.二叉树的直径
  • 【系统架构设计师】数据库系统 ② ( 分布式数据库 | 分布式数据库 特点 | 分布式数据库 分层模式 | 两阶段提交协议 - 2PC 协议 )
  • 浅谈WebSocket-FLV
  • 【Mysql】SQL 优化全解析
  • Java爬虫如何解析返回的JSON数据?
  • H3C 防火墙上配置端口映射
  • 旅游CMS选型:WordPress、Joomla与Drupal对比
  • HarmonyOS之深入解析跳转支付宝小程序完成操作后如何自动返回App
  • vue ts+Windi CSS
  • Unity打包崩溃SRP-URP-管线的问题:Shader::SRPBatcherInfoSetup()
  • 鸿蒙 ArkUI 应用上架流程
  • C# 文件夹与命名空间的关系解析
  • HTML5 新的 Input 类型学习笔记
  • linux之 内存管理(5)-CMA 连续内存管理器
  • 【深度学习】Cross-Attention(交叉注意力)机制详解与应用
  • 深入理解 Linux 中磁盘空间驱动的编写:从原理到实践
  • 自动化测试框架搭建完整指南
  • C# CancellationTokenSource CancellationToken Task.Run传入token 取消令牌
  • ppt模板免费的网站/东营网站seo
  • 做视频直播网站/百度账号登录个人中心
  • wordpress置顶不重复/aso优化是什么意思
  • 凡科网站教程/企业做推广有几种方式
  • 怎么做幼儿园的网站/优化落实疫情防控新十条
  • 做网站实名认证有什么用/seo也成搜索引擎优化