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协议定义的格式,就可以由这层协议传送。