协议确定了双方通信的规则和流程。在互联网的协议集中,有一种无连接的传输协议,被称为用户数据报协议(UDP,User Datagram Protocol)。

UDP 为应用程序提供了一种简单的数据传输方式,当我们谈到 UDP 应用场景时,一个非常著名的领域是实时多媒体应用。而当我们需要在网络上实现实时多媒体传输时,就需要更多的控制和管理,实时传输协议(RTP,Real-time Transport Protocol)应运而生。

RTP 就像是在 UDP 基础上加了一层,提供了更多的功能,比如序列号、时间戳等,使得我们能够更可靠地传输音频、视频等实时数据,可以说 RTP 是在 UDP 基础上扩展出来的,为实时多媒体应用提供了更好的支持。

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

什么是 RTP?

RTP,即实时传输协议(Real-time Transport Protocol),通常运行在用户空间,位于 UDP 之上。多媒体应用由多个音频、视频、文本组成。

音频、视频等东西先经过一个叫做 RTP 库的地方,就像是个装东西的盒子一样,然后 RTP 库把它们打包、编辑并编码成一个个小数据包,我们称之为 RTP 数据包。

这些 RTP 数据包被放进套接字里,就像是把东西放进信封里一样,接着,这些 RTP 数据包被放进了新生成的 UDP 包里,再通过 IP 地址发送到网络上。

在接收端,处理的顺序和发送端相反,先从 UDP 获取 RTP 小数据包,再解码、解析。最后,多媒体应用从 RTP 库那里接收到音视频等数据,然后播放出来。

RTP 的基本功能是将多个实时数据流打包到一个 UDP 数据包流中,这个 UDP 流可以发送给一个或多个目标主机。

由于 RTP 仅使用了普通的 UDP,所以路由器不会对其数据包有任何特殊处理,并且没有提供传输可靠性的保障措施,因此数据包可能会丢失、延迟或损坏。

无重传机制

RTP 格式包含了几种有助于接收端处理流媒体信息的特性,每个发送到 RTP 流中的数据包都会被分配一个编号,而且每个数据包的编号比它前面的数据包编号大 1,这个编号使得接收方能够确定是否有数据包丢失。

如果有数据包丢失,接收方的最佳动作是交给应用程序来处理。例如,如果丢失了一个视频数据包,可以考虑跳过这个视频帧;如果丢失了一个音频数据包,可以尝试使用插值法来估计已丢失的值。

重传并不是一种切实可行的方式,因为重传的数据包可能会到达得太晚以至于无法再被使用,因此RTP 没有确认机制,也没有提供重传的功能。

时间戳机制

时间戳机制是实时应用中的重要设施,它允许源端将每个数据包中的时间戳与整个流的起始时间相关联。这样做的好处是,接收端可以通过时间戳的差值来进行少量的缓冲工作。

时间戳机制不仅可以减少网络延迟变化的影响,还可以实现多个流之间的同步。

比如,一个数字电视可能有多个视频流和多个音频流,如果它们的时间戳都从同一个计数器开始,即使它们的传输有些不规则,它们仍然可以在接收端非常同步地播放出来。

时间戳由媒体流的源端生成,它记录了数据中第一个样本产生的时间,这个值有助于减轻接收端的时间变化,也就是所谓的抖动。

RTCP 实时传输控制协议

RTCP 实时传输控制协议(RTCP, Realtime Transport Control Protocol)是 RTP 的姐妹协议,专门负责处理反馈、同步和用户接口等信息,但它本身不传输任何媒体数据。

首先,RTCP 可以向源端提供有关延迟、抖动、带宽、网络拥塞等方面的反馈信息,源端利用这些反馈信息来根据当前网络状况动态地调整数据传输速率,以提供更好的质量。

当网络情况良好时,数据传输速率会提高以获得更好的质量,而当网络状况不佳时,数据传输速率会降低,通过持续地反馈信息,编码算法可以不断地进行调整,以在当前条件下提供尽可能好的质量。

其次,RTCP 还负责处理不同流之间的同步问题。不同流可能使用不同的时钟,并且具有不同的粒度和漂移速率,通过利用RTCP,可以确保这些流保持同步,使它们在播放时保持一致。

缓冲和抖动控制播放

在接收端,播放媒体的时候需要解决一个问题:即使数据包按照正确的时间间隔被发送到网络上,它们到达接收端的时间可能会有所不同,这种延迟的变化称为「抖动」。

即使抖动很小,如果简单地按照数据包到达的时间来播放,也可能导致视频画面的拉扯或音频的模糊。为了解决这个问题,在播放媒体之前通常会对其进行缓冲,以减少抖动的影响。

例如,当数据包在传输过程中受到了较大的抖动时,有些数据包可能会在很短的时间内到达,而有些可能需要更长的时间。在接收端,这些数据包会被缓冲起来,然后以平滑的速度播放出来,从而避免了突然的画面跳动或音频中断。

当一个数据包流在传输过程中遭受了很大的抖动,在 t=0 的时候,服务器发出数据包 1,该数据包在 t=1 时刻到达客户端,随后的数据包 2 遭受了更多的延迟,它经过 2 秒才到达客户端,随着数据包的到达,它们均被缓冲在客户端机器上。

从数据包 1 到 6 都已经在缓冲区,它们以平滑播放的间隔从缓冲区移出,可是,数据包 8 被延迟太多,当播放到它时还不可用,要么跳过数据包 8 继续播放后续的数据包,要么是停止播放,直到数据包 8 到达,这个时候在播放的时候就会出现一个「间隙」。

如果是语音 IP 通话,延迟数据包通常会被跳过去。在流媒体播放中,可以选择暂停,通过延迟媒体的播放来缓解这个问题,但为此要付出较大的缓冲区。对于像视频会议这样的实时应用,响应所需要的缓冲区较短。

今天文章内容各名词之间都有关联,总结一下:

UDP 则提供了简单的数据传输通道,负责将RTP打包好的数据包发送到网络上。

RTCP 通过向源端提供有关延迟、抖动、带宽和其他网络特性的反馈信息,帮助源端动态调整数据传输速率以提供更好的质量。

RTP 负责实时传输音视频等媒体数据,RTCP 则负责处理与传输相关的控制信息,而 UDP 则提供了 RTP 和 RTCP 传输数据的基础通道,但并不负责保证数据传输的可靠性。

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

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: