音视频知识点(六)

1.RTMP协议

1.1 RTMP建连流程

RTMP连接从握手开始:

  • 客户端发送三个消息C0/C1/C2
  • 服务端发送三个消息S0/S1/S2

握手是有一定顺序的:

  • 客户端通过发送 C0 和 C1 消息来启动握手过程。客户端必须接收到 S1 消息,然后发送 C2 消息。客户端必须接收到S2 消息,然后发送其他数据。
  • 服务端必须接收到 C0 或者 C1 消息,然后发送 S0 和 S1 消息。服务端必须接收到 C2 消息,然后发送其他数据。
    +-------------+                           +-------------+
    |    Client   |       TCP/IP Network      |    Server   |
    +-------------+            |              +-------------+
          |                    |                     |
    Uninitialized              |               Uninitialized
          |          C0        |                     |
          |------------------->|         C0          |
          |                    |-------------------->|
          |          C1        |                     |
          |------------------->|         S0          |
          |                    |<--------------------|
          |                    |         S1          |
     Version sent              |<--------------------|
          |          S0        |                     |
          |<-------------------|                     |
          |          S1        |                     |
          |<-------------------|                Version sent
          |                    |         C1          |
          |                    |-------------------->|
          |          C2        |                     |
          |------------------->|         S2          |
          |                    |<--------------------|
       Ack sent                |                  Ack Sent
          |          S2        |                     |
          |<-------------------|                     |
          |                    |         C2          |
          |                    |-------------------->|
     Handshake Done            |               Handshake Done
          |                    |                     |
              Pictorial Representation of Handshake
  • C0/S0 是版本号校验
  • C1/S1是时间戳校验
  • C2/S2 是回应

1.2 RTMP消息优先级

RTMP 的消息优先级是:控制消息 > 音频消息 > 视频消息。当网络传输能力受限时,优先传输高优先级消息的数据。

要使优先级能够有效执行,分块也很关键:将大消息切割成小块,可以避免大的低优先级的消息(如视频消息)堵塞了发送缓冲从而阻塞了小的高优先级的消息(如音频消息或控制消息)。

1.3 推流流程

  • RTMP_Alloc
  • RTMP_Init
  • RTMP_SetupURL
  • RTMP_EnableWrite
  • RTMP_Connect
  • RTMP_ConnectStream
  • SendRtmpMetadata
    • 对应的type是RTMP_PACKET_TYPE_INFO
  • SendRtmpAudioHeader
  • SendRtmpVideoHeader
    • 区分H264和H265的header信息
  • SendRtmpAudioData
    • 对应的type是RTMP_PACKET_TYPE_AUDIO
  • SendRtmpVideoData
    • 对应的type是RTMP_PACKET_TYPE_VIDEO
  • RTMP_Close
  • RTMP_Free

2.RTP/RTCP

  • RTP全称Real-time Transport Protocol,RTP为IP上的语音、图像等需要实时传输的多媒体数据提供端对端的传输服务,但本身无法保证服务质量(QoS),因此,需要配合实时传输控制协议(RTCP)一起使用。
  • RTCP全称Real-time Transport Control Protocol,监控服务质量并传送会话参与者信息,服务器可利用RTCP数据包信息改变传输速率、负载数据类型。
  • RTP和RTCP位于传输层,但运行在UDP协议之上。UDP协议实时性更好,可减少数据传输延时,另外,应用程序在UDP上运行RTP还可利用UDP的多路复用,校验和服务。
  • RTCP向RTP会话中的所有成员周期性的发送控制包,RTCP使用和RTP数据包相同的传输机制。RTP会话使用合法的偶数端口(2n),对应的RTCP包使用下一个奇数端口(2n+1)。


2.1 RTP数据包

  • 每帧RTP报文都是由头部(Header)和负载数据(Payload)两部分组成,头部前12个字节固定,存在于每一个RTP数据包中,最后的CSRC列表只在Mixer中使用。负载数据可以是音频数据或视频数据。
  • 序列号(sequence number)[16 bits]:标识数据包序列号,用于接收方重构数据包序列并记录丢包量,序列号初始值是随机产生的,每发送一个RTP数据包,序列号加1
  • 时间戳(timestamp)[32 bits]:标识RTP数据包中第一个字节的采样时间,时间戳初始值也是随机数,每个采样周期时间戳加1,接收端利用时间戳来去除由网络引起的数据包抖动,并且在接收端提供同步功能
  • SSRC(Synchronization Source)[32 bits]:同步源标识符用于标识RTP数据流的起源,在一个RTP会话中,每个数据流的SSRC都不同,同步源标识符的值是随机数
  • CSRC list(Contributing Source) [N*32 bits]:贡献源列表用于标识此RTP数据包中数据来源,由混频器将所有贡献源的SSRC标识符放入此表中,数量N由CC决定,最大数量为15,因此,当数量N超过15时,仅识别15个

2.2 RTCP数据包

RTP只负责传输数据包,需要与RTCP配合使用,由RTCP来保证RTP数据包的服务质量。RTCP的主要功能:服务质量的监控和反馈、媒体设备间的同步以及多播组中的成员标识。在RTP会话期间,各参与者周期性传送RTCP数据包,RTCP数据包中包含已发送的数据包数量、丢失的数据包数量等信息,各参与者通过这些信息动态改变传输速率或传输的数据类型。
主要有五种类型的封包:

  • SR:发送端报告,由发送 RTP 数据报的应用程序或终端发出的。
  • RR:接收端报告,由接受但不发送 RTP 数据报的应用程序或终端发出。
  • SDES:源描述,传递与会话成员有关的标识信息的载体,如用户名、邮件、电话等。
  • BYE:通知离开,通知会话中的其他成员将退出会话。
  • APP:由应用程序自己定义,作为 RTCP 协议的扩展。

RTP和RTCP协作传输多媒体数据的流程图如下图所示,在一个RTP会话中有发送端和接收端,发送端将数据封装到RTP中发送,同时以一定的时间间隔周期性发送RTCP中的发送报告(SR),也收到接收端发过来的接收报告(RR)或从其他发送端发送过来的发送报告(SR)。接收端获取到RTP数据包后解析数据,取得应用数据,获取其他参与者发送的发送报告(SR),接收数据的同时通过发送接收报告(RR)将RTCP反馈信息发送出去。

RTCP如何实现媒体流的同步:

  • sender SSRC :SR 包发送的同步源标识符。与对应 RTP 包中的 SSRC 一样。
  • NTP timestamp:SR 包发送时的绝对时间。用于同步不同的流。
  • RTP timestamp:与 NTP 时间戳对应,与 RTP 包中的时间戳具有相同的初始值。

3.RTSP

RTSP是实时流传输协议,它是应用层的协议。

  • 服务端和客户端是双向的。除了客户端可以请求服务端外,服务端也可以请求客户端。HTTP协议是客户端请求,服务端响应,单向的。
  • 单个服务端可以支持多个客户端的访问、请求。一对多的关系。这个不稀奇,只要是TCP/IP系统中,socket编写的服务器都是支持一对多。
  • 是用来控制声音、影像的多媒体串流协议。
  • 服务端能控制多路串流。
  • 服务端能可以选择TCP传送串流内容,也可以使用UDP传送串流内容,想用哪个就哪个。
  • 不强调时间同步,可以容忍延时。其实就是客户端请求串流,会缓存起来再播放,不讲究从服务端下载多少,播放多少。
  • 因为能控制多路串流,所以可以实现多方视频通讯,比如视频会议。
  • 有重新导向功能,可以根据负载情况来提供空闲的服务器。

RTSP是基于RTP协议传输数据,RTSP属于应用层,接收解析从RTP上来的数据包或者打包RTP格式的数据包扔给RTP层去传输。RTP属于传输层。 意思是数据包符合RTP协议定义的格式,就可以由这层协议传送。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容