关于SRT |特点|开始使用 |构建说明|示例应用程序和工具 |贡献 |许可证|发布
安全可靠传输 (SRT)是一种用于超低(亚秒)延迟实时视频和音频流以及通用批量数据传输的传输协议1 。 SRT 作为一项开源技术提供,其代码位于 GitHub、已发布的互联网草案以及不断增长的 SRT 用户社区。
SRT 作为视频流工作流程的一部分应用于贡献和分发端点,以始终提供最佳质量和最低延迟的视频。
安全的 | 加密视频流 |
可靠的 | 从严重丢包中恢复 |
运输 | 动态适应不断变化的网络条件 |
在直播流配置中,SRT 协议保持恒定的端到端延迟。这允许在接收器端重新创建实时流的信号特征,从而减少缓冲的需要。当数据包从源流式传输到目的地时,SRT 会检测并适应两个端点之间的实时网络状况。它有助于补偿由于噪声网络拥塞而导致的抖动和带宽波动。
SRT 实施 AES 加密来保护媒体流的有效负载,并提供各种错误恢复机制来最大限度地减少 Internet 连接中典型的数据包丢失,其中自动重复请求 (ARQ) 是主要方法。通过 ARQ,当接收方检测到数据包丢失时,它会向发送方发送警报,请求重传该丢失的数据包。该协议还支持前向纠错 (FEC) 和连接绑定,增加了无缝流保护和无中断故障转移。
要了解有关该协议的更多信息,请订阅创新实验室博客:
要提出问题,请加入#development频道中的对话
?单击 ► 按钮展开功能描述。
无论您的网络多么不可靠,SRT 都可以从严重的数据包丢失和抖动中恢复,从而确保视频流的完整性和质量。
SRT 的流纠错可配置以适应用户的部署条件。利用实时 IP 通信开发来扩展传统的网络错误恢复实践,SRT 提供的媒体延迟显着低于 TCP/IP,同时提供 UDP 传输速度并大大提高了可靠性。
与某些仅支持特定视频和音频格式的其他流媒体协议不同,SRT 与负载无关。由于 SRT 在网络传输级别运行,充当内容的包装器,因此它可以传输任何类型的视频格式、编解码器、分辨率或帧速率。
SRT 使用的握手过程支持出站连接,而不存在在防火墙中打开永久外部端口的潜在风险和危险,从而维护企业 LAN 安全策略并最大限度地减少 IT 干预的需要。
SRT 使用受到世界各地政府和组织信任的 128/192/256 位 AES 加密,确保有价值的内容受到端到端保护,从贡献到分发,以便未经授权的各方无法收听。
SRT 1.4 引入了数据包过滤器 API 。此机制允许在发送网络数据包之前在发送方执行自定义处理,并在接收方从网络接收数据包后执行自定义处理。 API 允许用户编写自己的插件,从而通过各种不同的数据包过滤进一步扩展 SRT 协议的功能。用户可以以任何方式操作生成的数据包过滤器数据,例如自定义加密、数据包检查或在发送数据之前访问数据。
作为使用数据包过滤器 API 可以实现的示例而创建的第一个插件是用于前向纠错 (FEC) 的,在某些用例中,它可以提供比自动重复请求 (ARQ) 稍低的延迟。该插件允许三种不同的模式:
仅 ARQ – 重传丢失的数据包,
仅 FEC – 提供接收端 FEC 恢复所需的开销,
FEC 和 ARQ – 重传 FEC 无法恢复的丢失数据包。
与托管网络上的 SMPTE-2022-7 类似,连接绑定为 SRT 协议添加了无缝流保护和无中断故障转移。这项技术依赖于多个 IP 网络路径,以防止在网络拥塞或中断时直播视频流中断,从而保持服务的连续性。
这是使用 SRT v1.5 中引入的套接字组来完成的。套接字组的一般概念是指拥有一个包含多个套接字的组,其中发送一个数据信号的一个操作应用于该组。组内的单个套接字将接管此操作并执行将信号传递到接收器所需的操作。
支持两种模式:
广播 - 在广播模式下,数据通过组中的所有成员链路冗余发送。如果其中一条链路发生故障或经历网络抖动和/或数据包丢失,则将通过组中的另一条链路接收丢失的数据。冗余数据包在接收端被简单地丢弃。
主/备份 - 在主/备份模式下,一次仅使用一条(主)链路进行数据传输,而其他(备份)连接处于备用状态,以确保在主链路发生故障时继续传输。主/备份模式的目标是在潜在的链路中断发生之前识别它,从而提供一个时间窗口,在该时间窗口内无缝切换到备份链路之一。
访问控制使上游应用程序能够将流 ID 分配给各个 SRT 流。通过使用自动生成或自定义的唯一流 ID,上游应用程序可以将多个 SRT 流发送到单个 IP 地址和 UDP 端口。然后,接收器可以使用流 ID 来识别和区分摄取流、应用用户密码访问方法,并且在某些情况下甚至应用基于流 ID 命名的自动化。例如,贡献可以发送到视频制作工作流程,监控可以发送到监控服务。
对于广播公司而言,流 ID 是取代 RTMP 将视频流(尤其是 HEVC/H.265 内容)提取到云服务或 CDN(为传入视频打开单个 IP 套接字(地址 + 端口))的关键。
SRT API | IETF 互联网草案 | 示例应用程序 |
SRT库API的参考文档 | SRT 协议互联网草案 | 使用测试应用程序的说明( srt-live-transmit 、 srt-file-transmit 等) |
SRT技术概述 | SRT部署指南 | SRT 食谱 |
早期草案技术概述(互联网草案的前身) | 协议的全面概述以及部署指南 | SRT协议开发笔记 |
创新实验室博客 | SRTLab YouTube 频道 | 松弛 |
Medium 上的博客,包含 SRT 相关技术文章 | 包含有用视频的技术 YouTube 频道 | Slack 频道获取最新动态并提出问题 加入 Slack 上的 SRT 联盟 |
为什么要进行SRT? - Marc Cymontkowski 所著的 SRT 简史和基本原理。
RTMP 与 SRT:比较延迟和最大带宽白皮书。
GitHub 上的文档,包含 SRT API 文档、功能描述等。
SRT 协议互联网草案:Datatracker |最新版本 |最新工作副本 | GitHub 存储库
Linux (Ubuntu/CentOS) |窗户| macOS | iOS |安卓 |包管理器
C++03或以上兼容编译器。
CMake 2.8.12 或更高版本作为构建系统。
OpenSSL 1.1 启用加密,否则使用-DENABLE_ENCRYPTION=OFF
进行构建。
多线程由以下任一方式提供:
C++11:标准库( std
by -DENABLE_STDCXX_SYNC=ON
CMake 选项),
C++03:Pthreads(对于 POSIX 系统,它是内置的,对于 Windows,有一个移植库)。
Tcl 8.5 是可选的,由./configure
脚本使用。否则,直接使用CMake。
有关构建系统和选项的详细说明,请阅读 SRT 构建选项文档。
当前存储库提供了演示 SRT 库 API 用法的示例应用程序和代码示例。其中包括srt-live-transmit
、 srt-file-transmit
和其他应用程序。可以在此处找到相应的文档。请注意,提供的所有示例均用于指导目的,不应在生产环境中使用。
srt-xtransmit
实用程序积极用于内部测试和性能评估。除其他功能外,它还支持虚拟有效负载生成、流量路由和连接绑定。其他详细信息可在srt-xtransmit
存储库本身中找到。
在开发过程中可能有用的 Python 工具有:
srt-stats-plotting
- 设计用于根据 SRT .csv
统计数据绘制图表的脚本。
lib-tcpdump-processing
- 一个库,旨在处理.pcap(ng)
tcpdump 或 Wireshark 跟踪文件并提取感兴趣的 SRT 数据包以进行进一步分析。
lib-srt-utils
- 一个 Python 库,包含用于基于实验配置运行 SRT 测试的支持代码。
欢迎任何人做出贡献。如果您决定参与,请花点时间查看指南:
SRT 开发人员指南
贡献
报告问题
有关参与互联网草案或提交问题的信息,请访问以下存储库。可以在此处找到用于 SRT CookBook 贡献的存储库。
通过向 SRT 项目贡献代码,即表示您同意根据 MPLv2.0 许可证授予您的贡献许可。
发行说明
SRT 版本控制
术语“直播流”是指具有延迟管理的连续数据传输(MPEG-TS 或同等内容)。基于 HTTP 实时流 (HLS) 协议(如 RFC8216 中所述)中的文件分段和传输的实时流不属于此用例的一部分。在这种情况下,应考虑以消息或缓冲模式进行文件传输。详细信息请参见互联网草案第 7 节:通过 SRT 进行数据传输的最佳实践和配置提示。请注意,SRT 与内容无关,这意味着任何类型的数据都可以通过其有效负载传输。 ↩