前言
RTMP协议规定,播放一个流媒体需要执行以下几个步骤:
- 建立一个网络连接(NetConnection),网络连接代表RTMP服务器端和客户端之间建立真正的网络连接。
- 建立一个网络流(NetStream)。网络流代表了发送多媒体数据的通道。这是一个逻辑连接,有点像 http协义中的 session。
- 播放流。
服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。他们的关系如图所示:
播放网络流
在RTMP服务器端对于每一个网络媒体流都建立了一个状态机,包括以下几个状态:
- 握手态;
- 连接态;
- 媒体流已建立态;
- 播放态;
RTMP通过命令来变更状态机。并在每个状态下做相应的工作。
握手(HandShake)
一个RTMP网络流的建立是以握手开始的,双方分别发送大小固定的三个数据块
- 握手开始于客户端发送C0、C1块。服务器收到C0或C1后发送S0和S1。
- 当客户端收齐S0和S1后,开始发送C2。当服务器收齐C0和C1后,开始发送S2。
- 当客户端和服务器分别收到S2和C2后,握手完成。
连接(NetConnection)
- 客户端发送命令消息“连接”(connect)到服务器。
- 服务器接收到“连接”消息后,发送确认窗口大小(Window Acknowledgement Size)消息到客户端。
- 服务器发送“设置带宽”消息到客户端。
- 客户端处理“设置带宽”消息后,发送确认窗口大小(Window Acknowledgement Size)消息到服务器端。
- 服务器发送消息“流开始”(Stream Begin)到客户端。
- 服务器发送消息“结果”,通知客户端连接的状态。
建立网络流(NetStream)
- 客户端发送消息“创建流”(createStream)到服务器端。
- 服务器端接收到“创建流”命令后,发送“结果”消息,通知客户端流的状态。
播放(Play)
- 客户端发送消息“播放”(play)到服务器。
- 接收到“播放”消息后,服务器发送设置块大小(ChunkSize)消息。
- 服务器发消息“streambegin”,告知客户端流ID。
- 服务器收到"播放"消息后,发送消息“响应状态” NetStream.Play.Start & NetStream.Play.reset,告知客户端“播放”命令执行成功。
- 之后,服务器发送客户端要播放的音频和视频数据。
小结
以上就是 RTMP协议的播放过程。建立一个网络流的播放就是以下这几步。
- 握手;
- 连接;
- 建立网络流;
- 播放;
目前,已经有很多开源库实现了 RTMP 协议。其中比较著名的是 librtmp 库,它是 rtmpdump 工具的一部分。
如果我们想实现简单的音视频直接可以直接使用 librtmp库作为我们的流媒体传输库。