SRS 入门:RTMP 推流与拉流源码流程
对应视频:
137--03-SRS流媒体服务器-RTMP推流框架分析.mp4138--04-SRS流媒体服务器-RTMP拉流框架分析.mp4141--06-SRS流媒体服务器-RTMP推流消息处理.mp4这篇讲 SRS 收到 RTMP 推流/拉流后,源码里大致怎么流转。重点是“流程感”,不是背函数名。
1. 先建立一张总图
SRS 里推流和拉流可以用这张图理解:
推流端
-> SrsRtmpConn
-> SrsSource
-> SrsConsumer
-> SrsRtmpConn
-> 拉流端
SrsSource 是中间最关键的对象。它代表一路媒体源。
- 推流端把消息写入
SrsSource。 - 拉流端创建
SrsConsumer,从SrsSource取消息。
2. RTMP 推流流程
推流端连接 SRS 后,先完成 RTMP 协议流程:
handshake
connect
createStream
publish
之后进入推流循环,SRS 不断读取客户端发来的消息。

推流消息主要包括:
| 消息 | 作用 |
|---|---|
| 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

刚入门时,只要抓住两个动作:
recv_message: 从 RTMP 连接读消息
process_message: 根据消息类型处理
4. SrsSource 的作用
SrsSource 像一个直播间的“媒体仓库”:
- 推流端来了,它负责接收这一路流。
- 拉流端来了,它负责给每个拉流端创建消费者。
- 有 metadata、音频头、视频头时,它会缓存,方便新观众刚进来就能解码。

为什么要缓存 metadata / sequence header:
- 新拉流客户端不是从直播开始时加入的。
- 解码器需要先知道视频/音频参数。
- 如果没有 SPS/PPS 或 AAC sequence header,播放器可能收到视频帧也解不出来。
5. 推流消息分发
课程的消息处理部分重点在:收到 RTMP message 后,根据类型分发。
收到 message
判断 message type
metadata -> on_meta_data
video -> on_video
audio -> on_audio
command -> process command

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

6. RTMP 拉流流程
拉流客户端连接 SRS 后,也要先走 RTMP 协议流程:
handshake
connect
createStream
play
然后 SRS 找到对应 SrsSource,创建 SrsConsumer,开始不断把消息发给客户端。

简化源码路径:
SrsRtmpConn::do_cycle
-> service_cycle
-> playing
-> create_consumer
-> do_playing
-> consumer->dump_packets
-> send_and_free_messages
7. 拉流端为什么需要 Consumer
一个推流可以有很多拉流用户。每个用户的网络速度、连接状态、播放进度都不一样。
所以不能让所有拉流端共用同一个读取游标。SRS 会给每个拉流端创建自己的 SrsConsumer。
入门理解:
SrsSource 保存一路流
SrsConsumer 表示某个观众从这一路流取数据

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 取消息。
评论
...正在读取评论。