RTMP 协议精讲
RTMP 协议精讲
Real-Time Messaging Protocol — 实时消息传输协议
RTMP 是由 Adobe(原 Macromedia)开发的用于在 Flash 平台与流媒体服务器之间传输音视频及数据的 TCP 协议。尽管 Flash 已退出历史舞台,但 RTMP 凭借其低延迟、成熟的生态和广泛的支持,依然是当前 推流端(Encoder → Server)的事实标准。
本教程共 12 章,从协议原理到生产部署,系统性地讲解 RTMP 技术栈。
目录导航
| 章节 | 文件 | 主题 | 关键词 |
|---|---|---|---|
| 01 | RTMP 协议概述 | Adobe 历史、与 HLS/DASH 对比、适用场景 | 协议对比、场景选型 |
| 02 | 握手过程 | C0C1C2/S0S1S2、版本协商、加密握手 | Handshake、RTMPE |
| 03 | 块流机制 | 块格式、块头、消息拆分、最大块长 | Chunk、Message Splitting |
| 04 | 消息格式 | 消息类型、音视频消息、控制消息 | Message Type、Protocol Control |
| 05 | AMF 编码与命令 | AMF0/AMF3、命令消息、远程过程调用 | AMF、RPC、connect/play |
| 06 | 流操作 | createStream、play、publish、pause、seek | Stream Lifecycle |
| 07 | 视频编解码 | H.264/H.265、FLV 封装、关键帧 | AVC/HEVC、NALU、FLV Tag |
| 08 | 音频编解码 | AAC/MP3、音频头、采样率、声道 | Audio Codec、ADTS |
| 09 | 流媒体服务器 | SRS、Nginx-RTMP、配置、集群 | Server、Origin/Edge |
| 10 | 流中转与分发 | 边缘节点、CDN、转码、录制 | Relay、CDN、Transcode |
| 11 | Docker 部署 | SRS 容器化、Compose、流媒体架构 | Docker、Compose |
| 12 | 最佳实践 | 低延迟优化、安全、监控、生产部署 | Latency、Security、Gop-Cache |
学习路线建议
┌─────────────────────────────────────────────────────────┐
│ RTMP 精讲学习路线 │
├─────────────────────────────────────────────────────────┤
│ │
│ 第一阶段:协议基础(必须) │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ 01 │→ │ 02 │→ │ 03 │→ │ 04 │→ │ 05 │ │
│ │概述 │ │握手 │ │块流 │ │消息 │ │AMF │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │
│ 第二阶段:媒体与流操作(核心) │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ 06 │→ │ 07 │→ │ 08 │ │
│ │流操作│ │视频 │ │音频 │ │
│ └─────┘ └─────┘ └─────┘ │
│ │
│ 第三阶段:工程实践(实战) │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ 09 │→ │ 10 │→ │ 11 │→ │ 12 │ │
│ │服务器│ │中转 │ │Docker│ │最佳 │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │
└─────────────────────────────────────────────────────────┘
环境准备
在开始学习之前,请准备以下环境:
必备工具
| 工具 | 用途 | 安装方式 |
|---|---|---|
| FFmpeg | 推流/拉流测试 | apt install ffmpeg 或 brew install ffmpeg |
| Wireshark | 抓包分析 RTMP 数据 | apt install wireshark |
| librtmp | RTMP 库/命令行工具 | apt install librtmp-utils |
| SRS | 开源流媒体服务器 | github.com/ossrs/srs |
| Docker | 容器化部署 | docs.docker.com |
快速验证
# 启动 SRS 开发服务器
docker run --rm -p 1935:1935 -p 1985:1985 -p 8080:8080 \
ossrs/srs:5
# 推送测试流
ffmpeg -re -i input.mp4 -c copy -f flv \
rtmp://localhost:1935/live/test
# 播放测试流
ffplay rtmp://localhost:1935/live/test