音视频学习(二十七):SRT协议

news/2024/12/21 11:20:52/

SRT(Secure Reliable Transport)是一种开源的网络传输协议,专为实时音视频数据传输设计,具有低延迟、高可靠性和安全性等特点。

核心功能

SRT协议旨在解决实时音视频传输中的网络抖动、丢包、延迟和安全问题,提供以下核心功能:

低延迟

  • 基于UDP传输,避免了TCP的握手和慢启动等机制导致的高延迟问题。
  • 使用了基于UDP的可靠性机制(ARQ,Automatic Repeat Request)来实现可靠的包传输,同时保持低延迟。

高可靠性

  • 包重传:SRT协议会检测丢包并触发重传机制,确保所有数据包最终传输到目标。
  • 网络抖动缓冲区(Jitter Buffer):用于吸收网络延迟的抖动,保证播放流的平滑性。
  • FEC(Forward Error Correction,前向纠错):在部分丢包情况下,接收端可通过冗余数据恢复原始数据。

安全性

  • 支持AES(Advanced Encryption Standard)加密,确保数据在传输过程中的安全性。

技术特点

基于UDP的传输协议

  • SRT利用UDP提供快速的数据传输能力,同时结合其自定义的控制机制(如握手、丢包重传)实现高可靠性。

时钟同步

  • SRT会对音视频数据的时间戳进行校准,确保传输的音视频流能够在接收端按原始顺序和时间播放。

动态链路调整

  • 根据网络状况(如丢包率、延迟、带宽)动态调整传输速率,适应复杂网络环境。

拥塞控制

  • 类似于TCP的拥塞控制机制,但更优化于实时流传输。

工作流程

建立连接

  • 双方通过握手(Handshake)建立连接,类似于TCP三次握手。
  • 支持多种握手模式,包括主叫(Caller)、被叫(Listener)和对等模式(Rendezvous)。

数据传输

  • 数据以UDP包的形式传输,传输过程中添加SRT头部信息(如序列号、时间戳等)。
  • 使用ARQ机制检测丢包并进行重传。

链路维护

  • 通过定期发送心跳包维持连接。
  • 动态调整传输参数以适应网络状况。

连接终止

  • 双方完成数据传输后关闭连接。

数据包结构

基本结构

| SRT Header | Payload |

SRT Header(头部)

SRT的头部用于携带控制信息、时间戳、序列号等,是实现可靠性和低延迟传输的关键部分。

数据包头部结构

数据包的头部长度为16字节,具体字段如下:

字节偏移字段名长度(字节)描述
0-3Sequence Number4数据包的序列号,用于重排序和丢包检测。
4-7Packet Timestamp4数据包的发送时间戳(相对于连接建立时的时间偏移量)。
8-11Destination Socket ID4目标Socket的唯一标识,用于区分不同的连接。
12-15Type/Control Info4标志位字段,包含数据包类型、丢包请求等信息(详见控制包结构部分)。

控制包头部结构

控制包的头部用于携带控制指令,格式为20字节,字段如下:

字节偏移字段名长度(字节)描述
0-3Control Type4控制类型标志,例如握手、丢包通知(NAK)、ACK确认等。
4-7Subtype4控制子类型,用于进一步区分具体的控制指令。
8-11Timestamp4发送该控制包时的时间戳。
12-15Destination Socket ID4目标Socket的标识符。
16-19Additional Info4额外的控制信息,例如NAK中指示丢失包的范围。

Payload(负载)

负载部分承载实际传输的数据,例如音视频流。其内容没有固定格式,由发送方根据应用需求组织。

  • 数据包负载通常是应用层的音视频数据块。
  • 控制包负载可能包含额外的控制信息,例如丢包范围、握手参数等。

数据包分类

数据包

  • 用于传输实际音视频数据。
  • 包含数据序列号和时间戳,以确保接收端能够重排序和按时间播放数据。
  • 数据包头部固定为16字节,后跟实际数据。

控制包

  • 用于维护连接状态和网络可靠性。
  • 控制包种类包括:
    • 握手(Handshake):用于建立连接和协商参数。
    • ACK(Acknowledgement):确认接收到的数据包序列。
    • NAK(Negative Acknowledgement):通知发送方哪些数据包丢失需要重传。
    • Keep-alive:心跳包,用于维持连接。
    • Shutdown:用于关闭连接。

数据包头部内容

假设有一个SRT数据包,头部的16字节内容如下(以十六进制表示):

复制代码
0x00 0x00 0x00 0x05 0x00 0x00 0x1F 0x40 0x12 0x34 0x56 0x78 0x01 0x00 0x00 0x00

解析如下:

  • Sequence Number: 0x00000005(序列号为5)。
  • Packet Timestamp: 0x00001F40(时间戳为8000,即8秒)。
  • Destination Socket ID: 0x12345678(Socket ID为0x12345678)。
  • Type/Control Info: 0x01000000(数据包类型标志)。

控制包的常见类型

以下是部分控制包的类型和用途:

类型代码控制包类型描述
0x0000Handshake用于连接建立时的握手操作。
0x0001Keep-alive保持连接的心跳包。
0x0002Acknowledgement确认接收的数据包序列号。
0x0003Negative ACK通知发送方丢失的包序列号范围。
0x0004Shutdown表示连接终止的通知包。

数据包和控制包的对比

特性数据包控制包
功能传输音视频等实际数据维护连接、可靠性和状态
头部长度16字节20字节
负载内容实际数据控制信息

应用场景

  • 实时直播:支持高质量低延迟的音视频内容传输,是流媒体直播的理想选择。
  • 远程制作:将拍摄现场的音视频内容实时传输到后期制作工作室。
  • 内容分发:用于CDN边缘节点之间的内容传输,优化传输效率。

与其他协议对比

特性SRTRTMPWebRTC
传输协议UDPTCPUDP
延迟低延迟(<1秒)较高(>3秒)超低延迟(毫秒级)
可靠性较低
安全性支持AES加密无原生加密支持SRTP加密
复杂性中等简单较高

优势与不足

优势

  • 低延迟:适合对实时性要求高的场景。
  • 高可靠性:即使在网络抖动和丢包严重的情况下,仍能保持较好的传输质量。
  • 安全性:内置加密功能,适合敏感数据传输。

不足

  • 相比TCP,SRT对网络环境的要求较高,复杂的协议实现增加了开发难度。
  • 在极端丢包率下可能会导致更高的延迟。

http://www.ppmy.cn/news/1556915.html

相关文章

组装一台电脑需要哪些硬件设备?点击了解

组装一台电脑是一个既有趣又实用的过程&#xff0c;我们可以根据自己的需求和预算来定制一台完全符合个人使用习惯的计算机。 一、核心部件 1、中央处理器&#xff08;CPU&#xff09; CPU是计算机的“大脑”&#xff0c;负责执行各种计算任务。它的性能直接影响到计算机的运…

【AI系列】Paddle Speech安装指南

文章目录 环境依赖1. 安装Python1.1 下载Python安装包1.2 安装gcc1.3 安装依赖库1.4 编译和安装Python1.5 配置环境变量 2. 安装PaddlePaddle3. 安装PaddleSpeech4. 运行PaddleSpeech5. 解决常见问题5.1 错误&#xff1a;libssl.so.1.1解决方法&#xff1a; 5.2 错误&#xff1…

建立在商用GPT上的简单高效单细胞表示模型

大规模基因表达数据正被用于单细胞表示模型的预训练。然而&#xff0c;这样的模型需要大量的数据管理和训练。在这里&#xff0c;作者探索了一种更简单的替代方案&#xff1a;使用 GPT-3.5 从单个基因的文本描述中生成基因嵌入&#xff0c;然后通过基因表达量加权gene embeddin…

坑人 C# MySql.Data SDK

一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MySql.Data,这就让人无语了,并且反馈都是升级了MySql.Data驱动引发,接下…

允许某段网络访问Linux服务器上的MariaDB

在Linux服务器上安装了MariaDB&#xff0c;默认情况下&#xff0c;只允许本机访问。在某些特殊的情况下&#xff0c;要允许外部访问。具体操作流程如下&#xff1a; 1 修改服务器配置 vi /etc/my.cnf.d/server.cnf取消下面的注释&#xff0c;以便允许外来的主机访问。 bind-…

青少年编程与数学 02-004 Go语言Web编程 09课题、访问数据库

青少年编程与数学 02-004 Go语言Web编程 09课题、访问数据库 一、数据库访问1. 安装数据库驱动2. 导入所需包3. 创建数据库连接4. 初始化数据库连接5. 使用GORM进行数据库操作 二、GORM三、GORM框架与Gin框架结合使用1. 初始化项目和安装依赖2. 配置数据库连接3. 定义数据模型4…

【uniapp】实战一人员交接班

前言 最近公司在搞一个功能,实现现场交接班的人知道需要作业前,需要提前检查、准备的工作,然后这个活安排到了我这,临时抱佛脚,赶制了一个粗略的成品。 项目成果展示 首页: 项目结构解析 项目结构介绍: 1、pages/:存放应用的页面文件,包含页面的 Vue 文件、JS 文…

【docker】docker swarm常用命令以及电商平台构建案例

1. 初始化Swarm集群 用于初始化一个Swarm集群&#xff0c;并将当前节点设置为Manager节点。 docker swarm init 用法&#xff1a; docker swarm init --advertise-addr <Manager节点IP>示例&#xff1a; docker swarm init --advertise-addr 192.168.1.100这会将当前节…