音视频直播系统之 WebRTC 中的协议UDP、TCP、RTP、RTCP详解

一、UDP/TCP

  • 如果让你自己开发一套实时互动直播系统,在选择网络传输协议时,你会选择使用UDP协议还是TCP协议

  • 假如使用 TCP 会怎样呢?在极端网络情况下,TCP 为了传输的可靠性,将会进行反复重发信息的操作

  • 在 TCP 协议中,为了避免重传次数过多,定时器的超时时间会按 2 的指数增长,也就是说,假设第一次设置的超时时间是 1 秒,那么第二次就是 2 秒,第三次是 4 秒……第七次是 64 秒。如果第七次之后仍然超时,则断开 TCP 连接,而对于这么长时间的延迟,实时互动的直播系统是根本无法接受的

  • 所以做在线直播系统时候一定要选择 UDP 协议

二、RTP 协议

  • 在实时互动直播系统传输音视频数据流时,我们并不直接将音视频数据流交给UDP 传输,而是先给音视频数据加个 RTP 头,然后再交给 UDP 进行传输

  • 因为视频数据在传输时,数据量太大,所以传输1帧可能需要几十个包,而数据传到接受端的时候,要将这几十个包进行组装,才能还原成完整的图像

  • 而RTP 协议就是为了然对接端组装数据之后,顺序不会乱而存在的,你想想,如果组装的时候,顺序乱了,组装出来的图像还是传输过来的图像吗

  • RTP 协议非常简单,这里对RTP进行简单的介绍

  • sequence number:序号,用于记录包的顺序

  • timestamp:时间戳,同一个帧的不同分片的时间戳是相同的。不同帧的时间戳是不同的

  • PT:Payload Type,数据的负载类型。音频流的 PT 值与视频的 PT 值是不同的,通过它就可以知道这个包存放的是什么类型的数据

  • SSRC:共享媒体流的源,它是全局唯一的,不同的SSRC标识不同的共享源

  • CC:CSRC的个数

  • CSRC:共享源,一般用在混音或混屏上

  • X:RTP扩展头标记,如果该位置是1,说明此RTP包还有扩展头

  • M:表示MARK位,用来界定视频帧边界

  • P:填充位

本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

三、RTP案例

  • 如果你在网络上接收了一组下面的音视频数据

  • 假设 PT=80 是视频数据,PT=100 是音频数据

  • 按照上面的规则,是不是就很容易组装数据了

{V=2,P=0,X=0,CC=0,M=0,PT:100,seq:14,ts:123456789,ssrc=888},
{V=2,P=0,X=0,CC=0,M=0,PT:80,seq:14,ts:123456789,ssrc=2345},
{V=2,P=0,X=0,CC=0,M=0,PT:100,seq:15,ts:123456789,ssrc=888},
{V=2,P=0,X=0,CC=0,M=0,PT:80,seq:15,ts:123456789,ssrc=2345},
{V=2,P=0,X=0,CC=0,M=0,PT:100,seq:16,ts:123456789,ssrc=888},
{V=2,P=0,X=0,CC=0,M=0,PT:80,seq:16,ts:123456789,ssrc=2345}

四、RTCP 协议

  • 在使用 RTP 包传输数据时,难免会发生丢包、乱序、抖动等问题

  • 比如:网络线路质量问题引起丢包率高、传输的数据超过了带宽的负载引起的丢包问题等等

  • 而在处理这些问题之前,WebRTC首先要让各端都知道它们自己的网络质量到底是怎样的,这就是 RTCP 的作用

  • RTCP 有两个最重要的报文RR(Reciever Report)SR(Sender Report)

  • 通过这两个报文的交换,各端就知道自己的网络质量了

  • 该报文协议如下图,其中字段的含义:

  • V=2:指报文的版本。

  • P:表示填充位,如果该位置 1,则在 RTCP 报文的最后会有填充字节

  • RC:全称 Report Count,指 RTCP 报文中接收报告的报文块个数

  • PT=200:Payload Type,也就是说 SR 的值为 200

  • Header:部分用于标识该报文的类型,比如是 SR 还是 RR

  • Sender info:部分用于指明作为发送方,到底发了多少包

  • Report block:部分指明发送方作为接收方时,它从各个 SSRC 接收包的情况

本文福利, 免费领取C++音视频学习资料包、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓ 

### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值