三者关系

RTMP 服务器与推拉流客户端在功能、角色和交互逻辑上有本质区别,结合提供的代码可从以下维度详细分析:

一、核心角色与功能

1. RTMP 服务器

  • 角色定位:作为中间节点,负责接收推流客户端的媒体数据,管理连接和会话,并将数据分发给所有拉流客户端
  • 核心功能:连接管理:通过 RtmpConnection 类处理每个客户端的 TCP 连接,完成握手(RtmpHandshake)、协议解析(RtmpChunk)和消息处理。会话管理:通过 RtmpSession 类按流路径(stream_path_)管理单个流的生命周期,区分推流端(发布者)和拉流端(订阅者)。数据转发:接收推流客户端的音视频数据(HandleAudio/HandleVideo),存储序列头(如 H.264/AAC 的编解码信息),并分发给所有拉流客户端(SendMediaData)。协议交互:处理客户端的 RTMP 命令(如 connect、publish、play),通过 AMF 编码/解码(AmfEncoder/AmfDecoder)完成指令响应。
  • 代码关键体现:RtmpServer 类监听端口(默认 1935),通过 OnConnect 为每个新连接创建 RtmpConnection。RtmpSession 类维护同一流的所有客户端,推流端发送的媒体数据通过 SendMediaData 广播给所有拉流端。

2. 推流客户端(发布者)

  • 角色定位:向服务器发送媒体数据(音视频流)的终端,如摄像头、编码器或直播软件(如 OBS)。
  • 核心功能:握手与连接:与服务器完成 RTMP 握手(发送 C0/C1,接收 S0/S1/S2,返回 C2),建立连接(connect 命令)。创建流与发布:通过 createStream 命令创建流,再通过 publish 命令将媒体数据(含序列头、音视频帧)推送到服务器。元数据发送:发送媒体元数据(如编码格式、分辨率),供服务器分发给拉流端。
  • 与服务器的交互逻辑:推流客户端在 RtmpConnection 中被标记为 START_PUBLISH 状态(IsPublisher()=true)。发送的音视频数据经服务器解析后,由 RtmpSession 存储序列头(SetAvcSequenceHeader/SetAacSequenceHeader)并转发。

3. 拉流客户端(订阅者)

  • 角色定位:从服务器接收媒体数据的终端,如播放器(如 VLC)或浏览器插件。
  • 核心功能:握手与连接:与服务器完成 RTMP 握手,建立连接后发送 play 命令请求特定流。接收与解码:接收服务器转发的媒体数据(含序列头和音视频帧),解析后解码播放。同步数据:新连接时,服务器会先推送序列头和元数据,确保拉流端能正确解码后续帧。
  • 与服务器的交互逻辑:拉流客户端在 RtmpConnection 中被标记为 START_PLAY 状态(IsPlayer()=true)。首次连接时,RtmpSession 会主动发送已存储的序列头(RTMP_AVC_SEQUENCE_HEADER/RTMP_AAC_SEQUENCE_HEADER),再推送实时媒体数据。

二、关键交互流程差异

握手阶段

接收 C0/C1,返回 S0/S1/S2,等待 C2

发送 C0/C1,接收 S0/S1/S2,返回 C2

同推流客户端(握手流程一致)

命令交互

处理 connect/publish/play 等命令

发送 connectcreateStreampublish

发送 connectcreateStreamplay

数据流向

接收推流数据并转发给拉流端

向服务器发送音视频数据

从服务器接收音视频数据

会话角色

管理流的发布者和订阅者

作为发布者加入会话

作为订阅者加入会话

三、代码层面的核心区别

  1. 服务器特有模块:RtmpServer:管理所有连接和会话,提供流的创建/删除通知(NotifyEvent)。RtmpSession:维护同一流的客户端列表,实现数据广播(推流→多拉流)。协议解析与转发逻辑:HandleChunk 解析 RTMP 分块,SendMediaData 分发数据。
  2. 客户端特有行为:推流端:发送 publish 命令,上传音视频序列头和帧数据(代码中通过 HandlePublish 触发服务器标记为发布者)。拉流端:发送 play 命令,接收服务器推送的序列头和实时数据(代码中通过 HandlePlay 触发服务器标记为订阅者)。

总结

  • RTMP 服务器是中枢节点,负责连接管理、协议解析和数据转发,核心是“中转与协调”。
  • 推流客户端是数据源头,负责将媒体数据编码并发送到服务器,核心是“上传数据”。
  • 拉流客户端是数据终点,负责从服务器接收并解码数据,核心是“下载与播放”。

三者通过 RTMP 协议的握手、命令交互和分块传输机制协同工作,实现流媒体的发布与分发。

全部评论

相关推荐

面了100年面试不知...:今年白菜这么多,冬天可以狂吃了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务