SRS 入门:RTMP 协议基础

对应视频:

  • 139--05-SRS流媒体服务器-RTMP协议1.mp4
  • 140--05-SRS流媒体服务器-RTMP协议2.mp4

这篇只讲 RTMP 的基础概念:握手、命令消息、chunk、connect/createStream/publish/play。刚入门先抓流程,不急着背所有字段。

1. RTMP 在做什么

RTMP 是一种基于 TCP 的流媒体协议。它既负责连接控制,也负责传输音视频消息。

一个 RTMP 客户端连 SRS 后,大致会这样走:

TCP connect
RTMP handshake
connect
createStream
publish 或 play
持续发送/接收 audio/video/script 消息
close

2. RTMP 握手

RTMP 握手发生在 TCP 连接建立之后,正式命令交互之前。

常见握手流程:

Client -> Server: C0 + C1
Server -> Client: S0 + S1 + S2
Client -> Server: C2

入门理解:

RTMP handshake 概览

握手成功后,双方才开始发送 RTMP command message 和媒体消息。

3. RTMP 消息和 Chunk

RTMP 不是简单地“一条消息直接一次发完”。它会把消息切成 chunk 传输。

先分清两个层次:

层次说明
Message语义层的一条消息,例如 connect、publish、音频帧、视频帧
Chunk传输层的小块,Message 可以被拆成多个 Chunk

RTMP message 基础概念

为什么要拆 chunk:

常见消息类型:

类型含义
Command Message命令消息,例如 connectcreateStreampublishplay
Audio Message音频数据
Video Message视频数据
Data Message元数据,例如 onMetaData
User Control Message用户控制消息,例如 Stream Begin
Window Acknowledgement Size确认窗口大小
Set Chunk Size设置 chunk 大小

4. SRS 中的握手代码

SRS 收到 RTMP 连接后,会先做握手,再进入命令消息处理。

SRS 中 RTMP 握手代码

可以用这个伪代码理解:

client 连接进来
SRS 创建 SrsRtmpConn
do_cycle()
    handshake()
    connect_app()
    service_cycle()

如果握手失败,后面的 connectpublishplay 都不会发生。

5. connect 命令

connect 是握手后的第一个关键命令。客户端通过它告诉服务器:

SRS 需要解析 connect 请求,并返回 _result

connect 响应相关代码

简化流程:

client: connect(app=live)
server: Window Acknowledgement Size
server: Set Peer Bandwidth
server: Set Chunk Size
server: _result

6. createStream

createStream 用来创建一个 RTMP stream id。后续 publishplay 会基于这个 stream id 进行。

createStream / closeStream 等命令包

入门理解:

连接是 TCP 级别的通道
stream 是 RTMP 里承载某一路媒体的逻辑通道

7. publish 和 play

publish 表示客户端要推流。

推流端 -> SRS:
    publish live/livestream
    metadata
    video messages
    audio messages

play 表示客户端要拉流。

播放器 -> SRS:
    play live/livestream
SRS -> 播放器:
    metadata
    video messages
    audio messages

推流和拉流的命令不一样,但它们最终会围绕同一个 SrsSource 工作:推流端把消息写进去,拉流端从里面读出来。

8. 用 Wireshark 看 RTMP

抓包时可以先看整体顺序:

TCP 三次握手
RTMP C0/C1/S0/S1/S2/C2
connect
createStream
publish 或 play
音视频数据

Wireshark 中查看 RTMP 流程

新手调试时不要一开始就抠每个字节,先确认:

9. RTMP 命令顺序速记

推流:

handshake
connect
createStream
publish
metadata
audio/video

拉流:

handshake
connect
createStream
play
metadata
audio/video

RTMP 协议流程总结

最后记住一句:

RTMP 先握手,再用命令建立会话,之后不断传 audio/video message。

评论

...

正在读取评论。