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

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占用。

相关文章:

SRT协议

SRT&#xff08;Secure Reliable Transport&#xff09;是一种开源的视频传输协议&#xff0c;专为高丢包、高延迟网络环境设计&#xff0c;结合了UDP的低延迟和TCP的可靠性&#xff0c;广泛应用于直播、远程制作、视频会议等场景。 定位&#xff1a;SRT协议的官方C/C实现库&am…...

K8S学习之基础五十一:k8s部署jenkins

k8s部署jenkins 创建nfs共享目录&#xff0c; mkdir -p /data/v2 echo /data/v2 *(rw,no_root_squash) > /etc/exports exportfs -arv创建pv、pvc vi pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: jenkins-k8s-pv spec:capacity:storage: 1GiaccessMod…...

在 Mermaid 流程图里“驯服”quot;的魔法指南!!!

&#x1f409; 在 Mermaid 流程图里“驯服”"的魔法指南 在使用 Mermaid 画流程图时&#xff0c;是不是经常遇到想秀一波 &quot; 却被它“反杀”的情况&#xff1f;&#x1f3af; 今天就来教大家如何在这头代码野兽的嘴里&#xff0c;抢回我们的双引号实体编码&#…...

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…...

欧几里得距离(Euclidean Distance)公式

欧几里得距离公式 欧几里得距离&#xff08;Euclidean Distance&#xff09;是计算两点之间直线距离的一种方法。它是最常见的距离度量方式之一&#xff0c;广泛应用于数学、物理、机器学习、计算机视觉等领域。 公式定义 1. 二维空间 在二维平面上&#xff0c;假设有两个点…...

HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库&#xff08;Database&#xff09;是一个以特定方式组织、存储和管理数据的集合&#xff0c;通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库&#xff0c;还通过一定的…...

【JavaScript】JavaScript Promises实践指南

【JavaScript】JavaScript Promises实践指南 你了解JavaScript中的Promises吗&#xff1f;这是一个很多人一开始就放弃的主题&#xff0c;但我会尽量让它变得尽可能简单。 1. “Promise”到底是什么&#xff1f; “Promise”是异步编程中的一个基本概念&#xff0c;特别是在J…...

【软件工程】习题及答案

目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1&#xff0e;关于引起软件危机的原因&#xff…...

git push的时候出现无法访问的解决

fatal: 无法访问 https://github.com/...&#xff1a;gnutls_handshake() failed: Error in the pull function. push的时候没有输入自己的github账号密码&#xff0c;为了解决每次push都要登录github这个问题&#xff0c;采用ssh密钥的方式认证&#xff0c;可以免去每次都输入…...

《深度剖析Android 12 SystemUI锁屏通知布局亮屏流程:从源码到实现》

优化后文章结构&#xff1a; 1. 前言 强调锁屏通知布局的重要性及分析目的&#xff0c;引出后续源码分析的必要性。 2. 核心类解析 KeyguardViewMediator&#xff1a;锁屏核心逻辑控制&#xff0c;处理亮屏/息屏事件分发。 PhoneWindowManager&#xff1a;系统输入事件&…...

为什么大模型在 OCR 任务上表现不佳?

编者按&#xff1a; 你是否曾经用最先进的大语言模型处理企业文档&#xff0c;却发现它把财务报表中的“$1,234.56”读成了“123456”&#xff1f;或者在处理医疗记录时&#xff0c;将“0.5mg”误读为“5mg”&#xff1f;对于依赖数据准确性的运营和采购团队来说&#xff0c;这…...

HCIP(VLAN综合实验)

实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机&#xff08;SW1、SW2、SW3&#xff09;个人电脑&#xff08;PC1、PC2、PC3、PC4、PC5、PC6&#xff09;路由器&#xff08;R1…...

每日算法-250328

记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说&#xff0c;我们首先定位到 left 位置节点的前一个节点 prev。然后&#xff0c;从 left 位置…...

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换

从 Word 到 HTML&#xff1a;使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中&#xff0c;我们经常需要将 Word 文档转换为 HTML&#xff0c;用于…...

Android 设备实现 adb connect 连接的步骤

1. 检查设备的开发者选项 确保平板设备已开启开发者模式&#xff0c;并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络&#xff0c;确认设备的 IP 地址是否正确。 通过 ping 命令测试&#xff1a; ping 192.168.3.243. 通过USB线进行初…...

【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…...

离散的数据及参数适合用什么算法做模型

离散数据和参数适用的机器学习算法取决于具体任务(分类、回归、聚类等)、数据特点(稀疏性、类别数量等)以及业务需求。以下是针对离散数据的常用算法分类和选择建议: 1. 分类任务(离散目标变量) 经典算法 决策树(ID3/C4.5/CART) 直接处理离散特征,无需编码,可解释性…...

VMware 安装 Ubuntu 实战分享

VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件&#xff0c;广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu&#xff0c;并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统&#xff1a;Windo…...

RSA 简介及 C# 和 js 实现【加密知多少系列_4】

〇、简介 谈及 RSA 加密算法&#xff0c;我们就需要先了解下这两个专业名词&#xff0c;对称加密和非对称加密。 对称加密&#xff1a;在同一密钥的加持下&#xff0c;发送方将未加密的原文&#xff0c;通过算法加密成密文&#xff1b;相对的接收方通过算法将密文解密出来原文…...

在IDEA中快速注释所有console.log

在IDEA中快速注释所有console.log 在前端IDEA中&#xff0c;快速注释所有console.log语句可以通过以下步骤实现2&#xff1a; 打开要修改的文件。使用快捷键CtrlF打开搜索框。点击打开使用正则搜索的开关或者通过AltR快捷键来打开。在搜索框输入[]*console.log[]*&#xff0c;…...

GPT-4o图像生成功能:技术突破与隐忧并存

2025年3月25日&#xff0c;OpenAI正式推出GPT-4o原生图像生成功能&#xff0c;宣称其实现了“文本到图像的终极跨越”。然而&#xff0c;这一被市场追捧的技术在短短72小时内便因用户需求过载触发限流&#xff0c;暴露出算力瓶颈与商业化矛盾的尖锐性。这场技术狂欢的背后&…...

SQL语言分类及命令详解(二)

目录 一、DQL (Data Query Language) 数据查询语言 核心命令&#xff1a;SELECT 基本语法&#xff1a; 详细分析&#xff1a; 高级特性&#xff1a; 示例&#xff1a; 二、DDL (Data Definition Language) 数据定义语言 核心命令 CREATE ALTER DROP TRUNCATE 详细…...

机器学习——LightGBM

LightGBM(light gradient boosting machine&#xff0c;轻量梯度提升机)是对XGBoost进行改进的模型版本&#xff0c;其三者之间的演变关系为&#xff1a;GBDT-》XGBoost-》LightGBM&#xff0c;依次对性能进行优化&#xff0c;尽管XGBoost已经很高效了&#xff0c;但是仍然有缺…...

linux 常见命令使用介绍

Linux 常见命令使用介绍 Linux 是一个功能强大的操作系统&#xff0c;其核心是命令行工具。掌握一些常用的 Linux 命令可以极大地提高工作效率。本文将详细介绍一些常见的 Linux 命令及其用法。 1. 文件与目录操作 ls - 列出文件和目录 # 查看当前目录下的所有文件和子目录&…...

故障识别 | 基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别,matlab代码

基于改进螂优化算法&#xff08;MSADBO&#xff09;优化变分模态提取&#xff08;VME&#xff09;结合稀疏最大谐波噪声比解卷积&#xff08;SMHD&#xff09;进行故障诊断识别 一、引言 1.1 机械故障诊断的背景和意义 在工业生产的宏大画卷中&#xff0c;机械设备的稳定运行…...

[已解决]服务器CPU突然飙高98%----Java程序OOM问题 (2024.9.5)

目录 问题描述问题排查问题解决参考资料 问题描述 业主单位服务器自8月29日晚上21:00起CPU突然飙高至98%&#xff0c;内存爆满&#xff0c;一直到9月5日&#xff1a; 问题排查 ①执行 top 命令查看Java进程PID top②执行top -Hp PID 命令查看具体的线程情况 top -Hp 3058输入上…...

spring如何用三级缓存解决循环依赖问题

spring为何会出现循环依赖问题&#xff1f; 我们举个会产生循环依赖的例子&#xff0c;如下所示&#xff0c;可以看到AService类中依赖了BService类&#xff0c;同理呢&#xff0c;BService类中依赖了AService类&#xff0c;这就是所谓的循环依赖。 Component("aService&…...

【C#】`Task.Factory.StartNew` 和 `Task.Run` 区别

Task.Factory.StartNew 和 Task.Run 都是用来启动新任务的&#xff0c;但它们有一些关键区别&#xff0c;我们来一条一条讲清楚&#xff08;配例子 结论&#xff09;。 &#x1f19a; 1. 语法和使用目的 对比项Task.RunTask.Factory.StartNew用途简化写法&#xff0c;用于启动…...

谈谈空间复杂度考量,特别是递归调用栈空间消耗?

空间复杂度考量是算法设计的核心要素之一&#xff0c;递归调用栈的消耗问题在前端领域尤为突出。 以下结合真实开发场景进行深度解析&#xff1a; 一、递归调用栈的典型问题 1. 深层次DOM遍历的陷阱 // 危险操作&#xff1a;递归遍历未知层级的DOM树 function countDOMNode…...

【2.项目管理】2.4 Gannt图【甘特图】

甘特图&#xff08;Gantt&#xff09;深度解析与实践指南 &#x1f4ca; 一、甘特图基础模板 项目进度表示例 工作编号工作名称持续时间(月)项目进度&#xff08;周&#xff09;1需求分析3▓▓▓░░░░░░░2设计建模3░▓▓▓░░░░░░3编码开发3.5░░░▓▓▓▓░░…...