RTMP播放流媒体过程

2020-04-02 10:27:42 浏览数 (2)

前言

RTMP协议规定,播放一个流媒体需要执行以下几个步骤:

  • 建立一个网络连接(NetConnection),网络连接代表RTMP服务器端和客户端之间建立真正的网络连接。
  • 建立一个网络流(NetStream)。网络流代表了发送多媒体数据的通道。这是一个逻辑连接,有点像 http协义中的 session。
  • 播放流。

服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。他们的关系如图所示:

播放网络流

在RTMP服务器端对于每一个网络媒体流都建立了一个状态机,包括以下几个状态:

  • 握手态;
  • 连接态;
  • 媒体流已建立态;
  • 播放态;

RTMP通过命令来变更状态机。并在每个状态下做相应的工作。

握手(HandShake)

一个RTMP网络流的建立是以握手开始的,双方分别发送大小固定的三个数据块

  1. 握手开始于客户端发送C0、C1块。服务器收到C0或C1后发送S0和S1。
  2. 当客户端收齐S0和S1后,开始发送C2。当服务器收齐C0和C1后,开始发送S2。
  3. 当客户端和服务器分别收到S2和C2后,握手完成。

连接(NetConnection)

  1. 客户端发送命令消息“连接”(connect)到服务器。
  2. 服务器接收到“连接”消息后,发送确认窗口大小(Window Acknowledgement Size)消息到客户端。
  3. 服务器发送“设置带宽”消息到客户端。
  4. 客户端处理“设置带宽”消息后,发送确认窗口大小(Window Acknowledgement Size)消息到服务器端。
  5. 服务器发送消息“流开始”(Stream Begin)到客户端。
  6. 服务器发送消息“结果”,通知客户端连接的状态。

建立网络流(NetStream)

  1. 客户端发送消息“创建流”(createStream)到服务器端。
  2. 服务器端接收到“创建流”命令后,发送“结果”消息,通知客户端流的状态。

播放(Play)

  1. 客户端发送消息“播放”(play)到服务器。
  2. 接收到“播放”消息后,服务器发送设置块大小(ChunkSize)消息。
  3. 服务器发消息“streambegin”,告知客户端流ID。
  4. 服务器收到"播放"消息后,发送消息“响应状态” NetStream.Play.Start & NetStream.Play.reset,告知客户端“播放”命令执行成功。
  5. 之后,服务器发送客户端要播放的音频和视频数据。

小结

以上就是 RTMP协议的播放过程。建立一个网络流的播放就是以下这几步。

  • 握手;
  • 连接;
  • 建立网络流;
  • 播放;

目前,已经有很多开源库实现了 RTMP 协议。其中比较著名的是 librtmp 库,它是 rtmpdump 工具的一部分。

如果我们想实现简单的音视频直接可以直接使用 librtmp库作为我们的流媒体传输库。

0 人点赞