0
点赞
收藏
分享

微信扫一扫

基于webrtc实现音视频通信

未定义变量 2024-10-13 阅读 32

理论

        流(Streaming 是近年在 Internet 上出现的新概念,其定义非常广泛,主要是指通过网络传输多媒体数据的技术总称。

流式传输分为两种

  1.  顺序流式传输  (Progressive Streaming)
  2.  实时流式传输  (Real time Streaming)

​​​​​实时流式传输是实时传送,特别适合现场事件。“实时”是指在一个应用中数据的交付必须与数据的产生保持精确的时间关系,这需要相应的协议支持,这样RTP和RTCP就相应的出现了。

1.什么是RTSP RTP RTCP SDP?

        网络体系

   SDP

        RTSP 运行在TCP或UDP之上,通常使用TCP来建立控制连接,而使用UDP来传输实际的媒体数据。它允许客户端请求实时数据流的播放、录制和广播,并且可以控制播放过程中的各种参数。在以tcp传输音频或视频时RTP RTCP使用统一音频或视频端口,在以udp传输 音频rtp和rtcp 以及视频rtp和rtcp都有独立的端口。

        

 小总结

rtsp承载与rtp和rtcp之上,rtsp并不会发送媒体数据,而是使用rtp协议传输,rtcp质量控制,sdp为了正确的输出音视频数据。

rtp并没有规定发送方式,可以选择udp发送或者tcp发送

使用udp传输数据端rtcp/rtp端口随机分布。

rtp协议封装

        rtp负责对流媒体数据进行封包并实现媒体流的实时传输,即它按照RPT数据包格式来封装流媒体数据,并利用与它绑定的协议进行数据包的传输。

        RTP报⽂由两部分组成:报头和有效载荷。12 个字节 RTP报头格式如下:
V:RTP协议的版本号,占2位,当前协议版本号为2。
P:填充标志,占1位,如果P=1,则在该报⽂的尾部填充⼀个或多个额外的⼋位组,用于包对齐,它们不是有效载荷
的⼀部分。
X:扩展报头,占1位,如果X=1,则在RTP报头后跟有⼀个扩展报头。
CC:CSRC计数器,占4位,指示CSRC 标识符的个数。

M: 最后一个分片位,占1位

  1. 对于视频数据,标记位通常用来指示一帧视频数据的结束。这可以帮助接收端确定何时完成了一帧数据的接收,从而可以进行解码和显示。

  2. 对于音频数据,标记位可能用来指示会话的开始或结束,或者一个逻辑流的开始。

PT: 有效载荷类型,占7位,⽤于说明RTP报⽂中有效载荷的类型,如GSM⾳频、JPEM图像等。

序列号 sequence:占16位,⽤于标识发送者所发送的RTP报⽂的序列号,每发送⼀个报⽂,序列号增1。接收者通过序列号来检测报⽂丢失情况,重新排序报⽂,恢复数据。需注意使用udp接收乱序时,应该设计一个重排机制。

时戳(Timestamp):占32位,时戳反映了该RTP报⽂的第⼀个⼋位组的采样时刻。接收者使⽤时戳来计算延迟和延迟抖动,并进⾏同步控制。需注意单位 如果是90khz 则1/90000 * 1000 = 0.0111s

同步信源(SSRC)标识符:占32位,⽤于标识同步信源。该标识符是随机选择的,参加同⼀视频会议的两个同步信源不能有相同的SSRC。
特约信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报⽂有效载荷中的所有特约信源。

SSRC和CSRC详细介绍

SSRC 同步信源是指产⽣媒体流的信源,例如**⻨克⻛、摄像机、RTP混合器**等。它通过RTP报头中的⼀个32位数字SSRC标识符来标识,⽽不依赖于⽹络地址,接收者将根据SSRC标识符来区分不同的信源,进⾏RTP报⽂的分组。
特约信源是指当混合器接收到⼀个或多个同步信源的RTP报⽂后,经过混合处理产⽣⼀个新的组合RTP报⽂,并把混合器作为组合RTP报⽂的SSRC,⽽将原来所有的SSRC都作为CSRC传送给接收者,使接收者知道组成组合报⽂的各个SSRC。

SSRC (Synchronization Source)

1. SSRC是一个32位的随机值,用于标识每个RTP数据流的来源。
2. 每个参与RTP会话的终端都会分配一个唯一的SSRC值。
3. SSRC值在RTP会话中是唯一的,可用于识别和区分不同的数据流。
4. SSRC值可能会在会话过程中发生变化,例如当终端重新加入会话时。

CSRC (Contributing Source)

1. CSRC用于标识参与混音的数据流。
2. 当一个RTP数据包包含来自多个源的混音音频数据时,该数据包的CSRC列表中会包含所有贡献源的SSRC值。
3. 接收端可以根据CSRC列表来确定哪些数据源参与了当前数据包的混音。
4. CSRC列表的长度可以在0到15之间变化。

SSRC和CSRC在RTP协议中的作用如下:

SSRC用于唯一标识每个数据流源,便于接收端进行同步和恢复。
CSRC用于标识参与混音的数据流源,便于接收端进行正确的音频混合和渲染。

这两个标识符确保了RTP会话中各数据流的独立性和可识别性,是RTP协议实现多路复用和同步的关键机制。

CSRC(Contributing Source Identifier)是通过RTP数据包头中的CC(CSRC Count)字段来携带的。例如,如果 CC 字段的值为 2,那么 CSRC 列表中就会有 2 个 32 位的 CSRC 标识符,代表有两个数据源参与了当前数据包的混合。

rtsp交互流程

推流(左图Clinet右图Server)

拉流

 ⼩总结

SDP协议

SDP 协议是一种会话描述协议,主要用于描述多媒体会话的各种参数,如媒体类型、编码格式、传输地址和端口等。它是 RTSP 协议的一部分,两者通常配合使用。

SDP 协议的主要作用有:

  1. 会话参数描述

    • 描述会话的名称、时间、带宽等基本参数
    • 描述会话中包含的媒体流,如音频、视频等
  2. 媒体参数描述

    • 描述每个媒体流的编码格式、传输协议、传输地址和端口等
    • 这些参数对接收端初始化和设置播放非常重要
  3. 网络传输参数描述

    • 描述 RTP/RTCP 使用的传输参数,如 SSRC、时间戳单位等
    • 这些参数对于媒体同步和质量控制很关键

SDP协议格式

SDP描述由许多⽂本⾏组成,⽂本⾏的格式为<类型>=<值>,<类型>是⼀个字⺟,<值>是结构化的⽂本串.

SDP的结构

SDP仅仅提供了对会话的描述,没有提供将会话和可能的参与者联系起来的⽅法,需要使⽤特定的编码集。字段名称只能使⽤US-ASCII字符集,⽂本信息可以使⽤任何语⾔。由于SDP的ASCII编码⽐⼆进制编码占⽤ 带宽多,所以SDP采⽤紧凑格式提⾼带宽利⽤率。如v=version,s=session name等等。字段名只⽤⼀个字符表示(⼤⼩写敏感),字段值可以有多个信息块组成,⽤分号隔开,“=”左右不能有空格。

SDP语法

根据sdp结构可知 开始是会话级随后媒体流的描述。第⼀个媒体描述 字段(m=)的出现,之后的每个媒体描述字段的出现标志着这个会话中⼜⼀个媒体流数据的开始。

必需字段

可选字段

SDP可选字段中,⼀些只能应⽤于会话级,⼀些只能应⽤于媒体级,还有⼀些可以应⽤于两种级别。

字段顺序

举例:

⼦字段

 在SDP中许多字段采⽤多个⼦字段的形式,此时,这些字段值由多个以空格符间隔的多个值组成。格式如 下:

字段名称=<⼦字段1的值> <⼦字段2的值> <⼦字段3的值>

a属性

大家可以抓包分析,有什么不懂的字段格式再去网上查。

RTCP协议

 RTCP报⽂格式--报⽂类型

 在RTP的规范(RFC 3550)中,⼀共定义了5种RTCP报告⽤来报告当前控制信息:

 RTCP的5种报告:RR,SR,SDES,BYE和APP。他们使⽤共同的结构,但是在某些具体的地⽅有⼀些不同。本文主要对200和201做出解析

以下是RTCP报⽂基本结构:

typedef struct _rtcp_header_t
{
    uint32_t v:2; // version
    uint32_t p:1; // padding
    uint32_t rc:5; // reception report count
    uint32_t pt:8; // packet type
    uint32_t length:16; /* pkt len in words, w/o this word */
} rtcp_header_t;

Version (V) 	2bit : RTCP 协议版本号,目前为 2。
Padding (P) 	1bit : 如果为 1,表示包尾有填充字节。
Item count(IC) 5bit : 有些RTCP分组类型包含多个条⽬(item)
,IC⽤来计算有多少个条⽬。因为IC只有5个⽐特,所以最多31个item。
如果需要的item超过31个,那么应⽤实现必须包含多个RTCP分组。
如果IC为0表示空的item列表。分组如果不需要item列表,那么可以把IC字段⽤于其他⽬的。

Packettype(PT) 8bit :**PT标识了分组中携带消息的类型**。在RTP标准中定义了5种类型:RR,SR,SDES,BYE和APP。
Length(M) 	   16bit :**分组⻓度,以4 bytes为单位,所以意味着RTCP分组必须是4字节对⻬。该⻓度不包含32 bites固定头,也就是说length为0也是合理的,说明只有4字节的头部(这种情况IC也是0)**。

**header size = 2 + 1 + 5 +8 + 16 = 4个字节**

 

RTCP报⽂格式-- SR报⽂格式

RTP协议还规定了最近发送数据的参与者发送SR,该报告提供了发送的媒体的⼀些 信息。主要⽤于接收端同步多媒体流,如语⾳和视频流。

 

 

RTCP报⽂格式-- RR报⽂格式

RTCP通过RR可以很好地保证传输质量,每个接收数据的参与者都要发出RR。

其中PT定义为201。接收者报告包含发送者的SSRC,跟随在由RC指定的(0个或多个)报告 块之后。

Extended highest sequence number received: 接收方收到的最高序号的 RTP 包。
Interarrival jitter: 接收到的 RTP 包的到达时间抖动。
Last SR (LSR): 上次收到的发送者报告(SR)的时间戳。
Delay since last SR (DLSR): 从上次收到 SR 报告到现在的时间延迟。

typedef struct _rtcp_rr_t // receiver report
{
	uint32_t ssrc;
} rtcp_rr_t;
typedef struct _rtcp_rb_t // report block
{
    uint32_t ssrc;
    uint32_t fraction:8; // fraction lost
    uint32_t cumulative:24; // cumulative number of packets lost
    uint32_t exthsn; // extended highest sequence number received
    uint32_t jitter; // interarrival jitter
    uint32_t lsr; // last SR
    uint32_t dlsr; // delay since last SR
} rtcp_rb_t;

丢包率计算:表示⽅式:分⺟固定为256,分⼦是loss fraction表示的整数。所以如果想要表示1/4的报⽂丢失,那么loss fraction=64。

丢包数量计算:cumulative number of packets lost不是以每个周期为计算范围,⽽是以整个会话为计算范围。所以0x7fffff是cumulative number of packets lost的最⼤值,因为它是带符号整数。

扩展⾼位序列号:随着会话时间增⻓,16⽐特⻓度的序列号可能会不够⽤,当序列号⼜回到初始化序列号时,为了表示这个环绕,在⾼16⽐特记录环绕的次数,也就是把序列号扩展了。

总结

       RTSP 是一种专门用于控制流媒体传输的网络协议,与 RTP(传输)/RTCP(质量控制) 和 SDP (session以及流媒体信息等等)协议一起构成了流媒体传输的核心技术。 

参考

音视频同步!RTCP 协议解析及代码实现_rtcp功能的含义和作用-CSDN博客

SDP协议详细总结-CSDN博客

实时流协议---RTSP【详解】-CSDN博客

学习资料分享

0voice · GitHub

举报

相关推荐

0 条评论