SRS 入门:RTMP 推流与拉流源码流程

对应视频:

  • 137--03-SRS流媒体服务器-RTMP推流框架分析.mp4
  • 138--04-SRS流媒体服务器-RTMP拉流框架分析.mp4
  • 141--06-SRS流媒体服务器-RTMP推流消息处理.mp4

这篇讲 SRS 收到 RTMP 推流/拉流后,源码里大致怎么流转。重点是“流程感”,不是背函数名。

1. 先建立一张总图

SRS 里推流和拉流可以用这张图理解:

推流端
  -> SrsRtmpConn
  -> SrsSource
  -> SrsConsumer
  -> SrsRtmpConn
  -> 拉流端

SrsSource 是中间最关键的对象。它代表一路媒体源。

2. RTMP 推流流程

推流端连接 SRS 后,先完成 RTMP 协议流程:

handshake
connect
createStream
publish

之后进入推流循环,SRS 不断读取客户端发来的消息。

RTMP publish 流程笔记

推流消息主要包括:

消息作用
metadata视频宽高、编码、帧率、音频采样率等信息
video视频帧,例如 H.264/AVC 数据
audio音频帧,例如 AAC 数据
command/control控制类消息

3. 推流源码处理路径

源码里可以简化成:

SrsRtmpConn::do_cycle
  -> service_cycle
  -> publishing
  -> acquire_publish
  -> do_publishing
  -> recv_message
  -> process_publish_message
  -> SrsSource::on_publish / on_video / on_audio

publish 循环相关代码

刚入门时,只要抓住两个动作:

recv_message: 从 RTMP 连接读消息
process_message: 根据消息类型处理

4. SrsSource 的作用

SrsSource 像一个直播间的“媒体仓库”:

SrsSource 推流相关代码

为什么要缓存 metadata / sequence header:

5. 推流消息分发

课程的消息处理部分重点在:收到 RTMP message 后,根据类型分发。

收到 message
判断 message type
    metadata -> on_meta_data
    video    -> on_video
    audio    -> on_audio
    command  -> process command

RTMP 推流消息分发关系

这一步是从“协议消息”进入“媒体源管理”的关键边界。

RTMP 推流消息处理笔记

6. RTMP 拉流流程

拉流客户端连接 SRS 后,也要先走 RTMP 协议流程:

handshake
connect
createStream
play

然后 SRS 找到对应 SrsSource,创建 SrsConsumer,开始不断把消息发给客户端。

RTMP play 流程概览

简化源码路径:

SrsRtmpConn::do_cycle
  -> service_cycle
  -> playing
  -> create_consumer
  -> do_playing
  -> consumer->dump_packets
  -> send_and_free_messages

7. 拉流端为什么需要 Consumer

一个推流可以有很多拉流用户。每个用户的网络速度、连接状态、播放进度都不一样。

所以不能让所有拉流端共用同一个读取游标。SRS 会给每个拉流端创建自己的 SrsConsumer

入门理解:

SrsSource  保存一路流
SrsConsumer 表示某个观众从这一路流取数据

RTMP 拉流运行验证

8. 推流和拉流如何接起来

最重要的连接关系:

推流端发送 audio/video
SRS 收到 message
SrsSource 缓存并分发
每个 SrsConsumer 收到消息
SRS 发给对应拉流端

这也是 SRS 能“一路推流,多人观看”的原因。

9. 新手调试顺序

推流不成功时:

1. TCP 是否连上
2. RTMP handshake 是否成功
3. connect 是否成功
4. publish 是否成功
5. 是否开始收到 audio/video
6. SrsSource 是否创建

拉流不成功时:

1. URL 的 app/stream 是否正确
2. RTMP play 是否发出
3. 对应 SrsSource 是否存在
4. Consumer 是否创建
5. 是否发送 metadata / sequence header
6. 是否持续发 audio/video message

最后记住这句话:

推流是把消息写进 SrsSource,拉流是从 SrsSource 创建 Consumer 取消息。

评论

...

正在读取评论。