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 |
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占用。
相关文章:
SRT协议
SRT(Secure Reliable Transport)是一种开源的视频传输协议,专为高丢包、高延迟网络环境设计,结合了UDP的低延迟和TCP的可靠性,广泛应用于直播、远程制作、视频会议等场景。 定位:SRT协议的官方C/C实现库&am…...
K8S学习之基础五十一:k8s部署jenkins
k8s部署jenkins 创建nfs共享目录, 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;的魔法指南!!!
🐉 在 Mermaid 流程图里“驯服”"的魔法指南 在使用 Mermaid 画流程图时,是不是经常遇到想秀一波 " 却被它“反杀”的情况?🎯 今天就来教大家如何在这头代码野兽的嘴里,抢回我们的双引号实体编码&#…...
GitHub美化个人主页3D图表显示配置操作
这个功能主要是用的这个开源仓库:https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话,我的个人主页:https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可,…...
欧几里得距离(Euclidean Distance)公式
欧几里得距离公式 欧几里得距离(Euclidean Distance)是计算两点之间直线距离的一种方法。它是最常见的距离度量方式之一,广泛应用于数学、物理、机器学习、计算机视觉等领域。 公式定义 1. 二维空间 在二维平面上,假设有两个点…...
HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+
核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库(Database)是一个以特定方式组织、存储和管理数据的集合,通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库,还通过一定的…...
【JavaScript】JavaScript Promises实践指南
【JavaScript】JavaScript Promises实践指南 你了解JavaScript中的Promises吗?这是一个很多人一开始就放弃的主题,但我会尽量让它变得尽可能简单。 1. “Promise”到底是什么? “Promise”是异步编程中的一个基本概念,特别是在J…...
【软件工程】习题及答案
目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1.关于引起软件危机的原因ÿ…...
git push的时候出现无法访问的解决
fatal: 无法访问 https://github.com/...:gnutls_handshake() failed: Error in the pull function. push的时候没有输入自己的github账号密码,为了解决每次push都要登录github这个问题,采用ssh密钥的方式认证,可以免去每次都输入…...
《深度剖析Android 12 SystemUI锁屏通知布局亮屏流程:从源码到实现》
优化后文章结构: 1. 前言 强调锁屏通知布局的重要性及分析目的,引出后续源码分析的必要性。 2. 核心类解析 KeyguardViewMediator:锁屏核心逻辑控制,处理亮屏/息屏事件分发。 PhoneWindowManager:系统输入事件&…...
为什么大模型在 OCR 任务上表现不佳?
编者按: 你是否曾经用最先进的大语言模型处理企业文档,却发现它把财务报表中的“$1,234.56”读成了“123456”?或者在处理医疗记录时,将“0.5mg”误读为“5mg”?对于依赖数据准确性的运营和采购团队来说,这…...
HCIP(VLAN综合实验)
实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机(SW1、SW2、SW3)个人电脑(PC1、PC2、PC3、PC4、PC5、PC6)路由器(R1…...
每日算法-250328
记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说,我们首先定位到 left 位置节点的前一个节点 prev。然后,从 left 位置…...
从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换
从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中,我们经常需要将 Word 文档转换为 HTML,用于…...
Android 设备实现 adb connect 连接的步骤
1. 检查设备的开发者选项 确保平板设备已开启开发者模式,并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络,确认设备的 IP 地址是否正确。 通过 ping 命令测试: ping 192.168.3.243. 通过USB线进行初…...
【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…...
离散的数据及参数适合用什么算法做模型
离散数据和参数适用的机器学习算法取决于具体任务(分类、回归、聚类等)、数据特点(稀疏性、类别数量等)以及业务需求。以下是针对离散数据的常用算法分类和选择建议: 1. 分类任务(离散目标变量) 经典算法 决策树(ID3/C4.5/CART) 直接处理离散特征,无需编码,可解释性…...
VMware 安装 Ubuntu 实战分享
VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件,广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu,并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统:Windo…...
RSA 简介及 C# 和 js 实现【加密知多少系列_4】
〇、简介 谈及 RSA 加密算法,我们就需要先了解下这两个专业名词,对称加密和非对称加密。 对称加密:在同一密钥的加持下,发送方将未加密的原文,通过算法加密成密文;相对的接收方通过算法将密文解密出来原文…...
在IDEA中快速注释所有console.log
在IDEA中快速注释所有console.log 在前端IDEA中,快速注释所有console.log语句可以通过以下步骤实现2: 打开要修改的文件。使用快捷键CtrlF打开搜索框。点击打开使用正则搜索的开关或者通过AltR快捷键来打开。在搜索框输入[]*console.log[]*,…...
GPT-4o图像生成功能:技术突破与隐忧并存
2025年3月25日,OpenAI正式推出GPT-4o原生图像生成功能,宣称其实现了“文本到图像的终极跨越”。然而,这一被市场追捧的技术在短短72小时内便因用户需求过载触发限流,暴露出算力瓶颈与商业化矛盾的尖锐性。这场技术狂欢的背后&…...
SQL语言分类及命令详解(二)
目录 一、DQL (Data Query Language) 数据查询语言 核心命令:SELECT 基本语法: 详细分析: 高级特性: 示例: 二、DDL (Data Definition Language) 数据定义语言 核心命令 CREATE ALTER DROP TRUNCATE 详细…...
机器学习——LightGBM
LightGBM(light gradient boosting machine,轻量梯度提升机)是对XGBoost进行改进的模型版本,其三者之间的演变关系为:GBDT-》XGBoost-》LightGBM,依次对性能进行优化,尽管XGBoost已经很高效了,但是仍然有缺…...
linux 常见命令使用介绍
Linux 常见命令使用介绍 Linux 是一个功能强大的操作系统,其核心是命令行工具。掌握一些常用的 Linux 命令可以极大地提高工作效率。本文将详细介绍一些常见的 Linux 命令及其用法。 1. 文件与目录操作 ls - 列出文件和目录 # 查看当前目录下的所有文件和子目录&…...
故障识别 | 基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别,matlab代码
基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别 一、引言 1.1 机械故障诊断的背景和意义 在工业生产的宏大画卷中,机械设备的稳定运行…...
[已解决]服务器CPU突然飙高98%----Java程序OOM问题 (2024.9.5)
目录 问题描述问题排查问题解决参考资料 问题描述 业主单位服务器自8月29日晚上21:00起CPU突然飙高至98%,内存爆满,一直到9月5日: 问题排查 ①执行 top 命令查看Java进程PID top②执行top -Hp PID 命令查看具体的线程情况 top -Hp 3058输入上…...
spring如何用三级缓存解决循环依赖问题
spring为何会出现循环依赖问题? 我们举个会产生循环依赖的例子,如下所示,可以看到AService类中依赖了BService类,同理呢,BService类中依赖了AService类,这就是所谓的循环依赖。 Component("aService&…...
【C#】`Task.Factory.StartNew` 和 `Task.Run` 区别
Task.Factory.StartNew 和 Task.Run 都是用来启动新任务的,但它们有一些关键区别,我们来一条一条讲清楚(配例子 结论)。 🆚 1. 语法和使用目的 对比项Task.RunTask.Factory.StartNew用途简化写法,用于启动…...
谈谈空间复杂度考量,特别是递归调用栈空间消耗?
空间复杂度考量是算法设计的核心要素之一,递归调用栈的消耗问题在前端领域尤为突出。 以下结合真实开发场景进行深度解析: 一、递归调用栈的典型问题 1. 深层次DOM遍历的陷阱 // 危险操作:递归遍历未知层级的DOM树 function countDOMNode…...
【2.项目管理】2.4 Gannt图【甘特图】
甘特图(Gantt)深度解析与实践指南 📊 一、甘特图基础模板 项目进度表示例 工作编号工作名称持续时间(月)项目进度(周)1需求分析3▓▓▓░░░░░░░2设计建模3░▓▓▓░░░░░░3编码开发3.5░░░▓▓▓▓░░…...
