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

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

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.kler.cn/a/451381.html

相关文章:

  • MySQL索引为什么是B+树
  • Qt creator ,语言家功能缺失解决方法
  • [Android]按下扫描键时启动一个线程来执行某些操作
  • flask基础
  • 系统压力测试助手——stress-ng
  • QT用Enigmavb 打包成单独exe
  • Excel 列名称转换问题 Swift 解答
  • LeetCode 343.整数拆分
  • #渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍11基于XML的SQL注入(XML-Based SQL Injection)
  • 考前96天 学习巩固 计算机、数学、英语
  • leetcode 3132. 找出与数组相加的整数 II 中等
  • MySQL追梦旅途之慢查询分析工具mysqldumpslow和pt-query-digest
  • Maximum Crossings (Hard Version)最大交叉次数(困难版本)
  • ROS1入门教程5:简单行为处理
  • 【es6复习笔记】生成器(11)
  • C++-------回溯最大最小算法
  • Word表格批量添加题注代码
  • 反汇编一个简单的C程序
  • MySQL的架构设计和设计模式
  • 面试记录24年新
  • 乐乐音乐Flutter版
  • OceanBase之primary_one概念学习
  • call、bind、apply的区别
  • Python OCR 文字识别
  • 基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(二)
  • 外包干了两年,技术退步明显。。。。