文章目录
- RTMP 核心高频面试题
- 1. 什么是 RTMP?有什么特点?
- 2. RTMP 协议栈分层?
- 3.RTMP 握手过程(Handshake)?
- 4. RTMP Chunk(块)的作用和格式?
- 5. Chunk Stream ID(CSID)和 Message Stream ID 的区别?
- 6. RTMP 消息头的 4 种格式(fmt=0/1/2/3)?
- 7. RTMP 常见消息类型?
- 8. AMF 是什么?AMF0 和 AMF3 的区别?
- 9. RTMP 推流(Publish)完整流程?
- 10. RTMP 拉流(Play)完整流程?
- 11. RTMP 的 AAC/AVC 序列头是什么?
- 12. RTMP 视频数据的关键帧和非关键帧标识?
- 13. RTMP 的时间戳(Timestamp)机制?
- 14. RTMP 的流量控制机制?
- 15. RTMP vs RTSP vs HLS 对比?
- 16. RTMP 的变种协议?
- 17. RTMP 延迟由哪些因素构成?如何优化?
- 18. RTMP 推流为什么首帧慢?怎么优化?
- 19. RTMP 如何实现多路流复用?
- 20. RTMP 连接失败常见原因?
- 21. RTMP 的 Chunk Size 对性能有什么影响?默认值是多少?如何调整?
- 22. RTMP 协议中的 User Control Message 有哪些常见事件?分别在什么场景触发?
- 23. RTMP 播放时如何实现 Seek(跳转)和暂停?
- 24. RTMP 中的 Shared Object 是什么?有什么用途?
- 25. RTMP 连接中,connect 命令通常携带哪些参数?各有什么含义?
- 26. 请描述 RTMP 协议中音频 Tag 的详细结构?
- 27. RTMP 视频 Tag 的详细结构?AVCPacketType 有哪两种?
- 28. RTMP 协议是如何保证可靠性的?TCP 拥塞控制会对 RTMP 直播产生什么影响?
- 29. RTMP 推流过程中,如果网络抖动导致数据积压,常见的处理策略有哪些?
- 30. RTMP、RTSP、WebRTC 三种协议在实时互动直播场景下如何选型?
RTMP 核心高频面试题
1. 什么是 RTMP?有什么特点?
- RTMP(Real-Time Messaging Protocol)是 Adobe 开发的基于 TCP 的实时消息传输协议
- 特点:低延迟(通常 1-3 秒)、基于长连接、支持音视频和数据消息、有状态协议
- 默认端口:1935
2. RTMP 协议栈分层?
- 物理层/传输层:TCP(保证可靠传输)
- RTMP 块层(Chunk Layer):将消息拆分为 Chunk 进行传输,多路复用
- RTMP 消息层(Message Layer):定义各种消息类型(音视频、命令、数据等)
3.RTMP 握手过程(Handshake)?
- 简单握手:
- C0(1字节,版本号)+ C1(1536字节,时间戳+随机数据)
- S0 + S1 + S2(回应 C1 的时间戳等)
- C2(回应 S2)
- 共 3 个来回,C0/C1 → S0/S1/S2 → C2
- 复杂握手:涉及加密(RTMPE),包含 Diffie-Hellman 密钥交换和 HMAC 验证
4. RTMP Chunk(块)的作用和格式?
- 作用:将大消息拆分为小块,实现多路复用和优先级控制,减少大消息阻塞
- Chunk 基本组成:
- Basic Header(1-3字节):Chunk Stream ID + 消息头类型(fmt)
- Message Header(0/1/3/7/11字节):时间戳、消息长度、消息类型、消息流ID
- Extended Timestamp(0/4字节):时间戳超过最大值时使用
- Chunk Data:实际数据
5. Chunk Stream ID(CSID)和 Message Stream ID 的区别?
- CSID:标识块流通道,用于多路复用,接收端根据 CSID 组装消息
- Message Stream ID:标识逻辑上的消息流(如音频流、视频流、命令流),同一个 CSID 可以承载不同 Message Stream ID 的消息
6. RTMP 消息头的 4 种格式(fmt=0/1/2/3)?
- fmt=0(全量头,11字节):新消息流开始时使用,包含完整信息
- fmt=1(8字节):同一条流的后续消息,省略 msg stream id
- fmt=2(3字节):只含时间戳增量,用于连续相同大小和类型的消息
- fmt=3(0字节):完全复用前一个 Chunk 头信息,用于连续相同属性的消息
高频考点:为什么有多种格式?——压缩冗余,同一条流的后续消息很多字段相同,不需要重复传输。
7. RTMP 常见消息类型?
| 类型 ID | 名称 | 说明 |
|---|---|---|
| 1 | Set Chunk Size | 设置块大小,默认 128 字节 |
| 2 | Abort | 中断某个块流 |
| 3 | Acknowledgement | 确认收到字节数 |
| 4 | User Control | 用户控制消息(如 StreamBegin、StreamEOF) |
| 5 | Window Acknowledgement Size | 窗口确认大小(流量控制) |
| 6 | Set Peer Bandwidth | 设置对端带宽 |
| 8 | Audio Message | 音频数据 |
| 9 | Video Message | 视频数据 |
| 15 | AMF3 Data | AMF3 格式数据消息 |
| 16 | AMF3 Shared Object | AMF3 共享对象 |
| 17 | AMF3 Command | AMF3 命令消息 |
| 18 | AMF0 Data | AMF0 格式数据消息 |
| 19 | AMF0 Shared Object | AMF0 共享对象 |
| 20 | AMF0 Command | AMF0 命令消息(connect、play、publish 等) |
8. AMF 是什么?AMF0 和 AMF3 的区别?
- AMF(Action Message Format)是 RTMP 用于序列化数据的二进制格式
- AMF0:旧版格式,支持基本类型(Number、Boolean、String、Object、Array 等)
- AMF3:新版格式,更紧凑,支持更多类型(如 ByteArray、XML、Vector),有引用机制减少重复数据
9. RTMP 推流(Publish)完整流程?
- TCP 三次握手 → 建立连接
- RTMP 握手(C0/C1 → S0/S1/S2 → C2)
- connect 命令:客户端发送 connect 命令,携带 app 名、flashVer 等,服务端返回
_result - releaseStream / FCPublish:客户端申请发布流
- createStream:创建流通道,服务端返回 stream id
- publish 命令:发送 publish(流名 + 类型 live/record/append)
- 发送音视频数据:持续发送 Audio Message 和 Video Message
10. RTMP 拉流(Play)完整流程?
- TCP 握手 + RTMP 握手 + connect(同上)
- createStream → 获取 stream id
- play 命令:发送 play(流名 + 起始 + 时长 + 重置)
- 服务端发送 User Control(StreamBegin) → Status(NetStream.Play.Start) → 音视频数据
- 拉流端收到数据后解码播放
11. RTMP 的 AAC/AVC 序列头是什么?
- AAC 序列头(AudioSpecificConfig):音频开始前发送,包含采样率、声道数、编码配置等解码必需信息,存储在 Audio Tag 的第一个包中(PacketType=0)
- AVC 序列头(AVCDecoderConfigurationRecord):视频开始前发送,包含 SPS/PPS 等解码信息,存储在 Video Tag 的第一个包中(PacketType=0)
- 后续的音视频数据 PacketType=1,表示 NALU 数据或 AAC 原始数据
12. RTMP 视频数据的关键帧和非关键帧标识?
- Video Tag 的第一个字节高 4 位为 FrameType:
- 1 = keyframe(关键帧,H.264 中为 IDR 帧)
- 2 = inter frame(非关键帧,P/B 帧)
- 3 = disposable inter frame
- 低 4 位为 CodecID:
- 7 = AVC(H.264)
- 10 = HEVC(H.265,扩展支持)
- 2 = AAC(注:这是音频的 CodecID,视频中不同)
13. RTMP 的时间戳(Timestamp)机制?
- 每个 Chunk 携带时间戳或时间戳增量(delta)
- 单位:毫秒
- 3 字节存储,最大值 0xFFFFFF(约 1677 秒),超过则使用 Extended Timestamp(4 字节)
- 音视频同步依靠各自的时间戳和同一时间基准
14. RTMP 的流量控制机制?
- Window Acknowledgement Size:设置窗口大小,接收方每收到窗口大小的数据后要发送 Acknowledgement
- Set Peer Bandwidth:设置对端带宽上限,结合 ACK 实现拥塞控制
- 发送方如果没有及时收到 ACK,会降低发送速率
15. RTMP vs RTSP vs HLS 对比?
| 维度 | RTMP | RTSP | HLS |
|---|---|---|---|
| 传输层 | TCP | UDP/TCP | HTTP(TCP) |
| 延迟 | 1-3s | 1-3s(UDP) | 10-30s |
| 协议类型 | 有状态 | 有状态(信令)+ RTP(媒体) | 无状态 |
| 防火墙穿透 | 差(1935端口) | 差 | 好(80/443) |
| 兼容性 | Flash 时代主流,需插件 | 安防/监控领域 | 移动端/网页通用 |
| 适用场景 | 直播推流、互动直播 | 安防摄像头、IPTV | 点播、直播分发 |
16. RTMP 的变种协议?
- RTMPT:RTMP over HTTP,用 HTTP 封装 RTMP 数据,穿透防火墙(端口 80)
- RTMPS:RTMP over TLS/SSL,加密传输,端口 443
- RTMPE:RTMP 加密,使用 Adobe 自有加密算法,握手阶段协商密钥
- RTMP Dump:纯数据格式,文件形式存储 RTMP 流
17. RTMP 延迟由哪些因素构成?如何优化?
- 延迟来源:
- 采集编码延迟(编码器 buffer、I 帧间隔)
- 网络传输延迟(RTT、拥塞)
- 服务端转发延迟(队列、buffer)
- 客户端播放缓冲延迟(jitter buffer、解码缓冲)
- 优化手段:
- 减小 GOP 长度(I 帧间隔)
- 调整 Chunk Size(适当增大可减少包头开销)
- 减小播放端 buffer
- 选用更近的接入节点
- 使用 TCP_NODELAY 禁用 Nagle 算法
18. RTMP 推流为什么首帧慢?怎么优化?
- 原因:需要等待第一个关键帧(I 帧)才能解码;GOP 越大首帧等待越久
- 优化:
- 推流开始时立即发送一个 IDR 帧
- 服务端缓存最近的 GOP,新观众接入时先发缓存的关键帧
- 减小 GOP 长度(如 1-2 秒一个 I 帧)
19. RTMP 如何实现多路流复用?
- 通过 Chunk Stream ID 在同一个 TCP 连接上承载多个逻辑流
- 不同流的 Chunk 交错发送,接收端根据 CSID 分别组装
- 例如:一条连接上同时传输音频流、视频流、命令流
20. RTMP 连接失败常见原因?
- 端口 1935 被防火墙拦截
- 服务端未启动或应用名(app)错误
- 流名已被占用(推流冲突)
- 鉴权失败(token 过期/错误)
- 网络不通或 DNS 解析失败
21. RTMP 的 Chunk Size 对性能有什么影响?默认值是多少?如何调整?
参考答案:
- 默认值:128 字节
- 过小:Chunk 数量多,包头开销占比大,传输效率低
- 过大:大消息占用连接时间长,影响其他流的实时性(队头阻塞)
- 调整方式:发送 Set Chunk Size(类型 ID = 1) 消息通知对端
- 实践中通常设置为 4096 或更大,以平衡开销和延迟
22. RTMP 协议中的 User Control Message 有哪些常见事件?分别在什么场景触发?
参考答案:
| 事件 ID | 事件名称 | 触发场景 |
|---|---|---|
| 0 | Stream Begin | 流开始时发送 |
| 1 | Stream EOF | 流结束,无更多数据 |
| 2 | Stream Dry | 流已空(无数据可发) |
| 3 | Set Buffer Length | 设置客户端缓冲区长度 |
| 4 | StreamIsRecorded | 流已被录制 |
| 6 | Ping Request | 服务端探测客户端是否存活 |
| 7 | Ping Response | 客户端回应 Ping |
23. RTMP 播放时如何实现 Seek(跳转)和暂停?
参考答案:
- Seek:客户端发送带有
start参数(负数表示从指定位置开始)的 play 命令,或使用seek命令 - 暂停:客户端发送
pause命令(true=暂停,false=恢复) - 注意:Seek 只能定位到关键帧(I 帧)位置,服务端需要从最近的关键帧开始发送数据
- 直播流通常不支持 Seek(因为是实时流),点播流支持
24. RTMP 中的 Shared Object 是什么?有什么用途?
参考答案:
- 共享对象(Shared Object)是一种在多个客户端之间同步数据的机制
- 可以理解为"远程共享变量",服务端维护数据状态,客户端订阅变更
- 用途:
- 实时聊天室的用户列表同步
- 多人协作/白板的数据共享
- 直播在线人数实时更新
- 游戏状态同步
- 分为 持久化 和 临时 两种,临时的在连接断开后清除
25. RTMP 连接中,connect 命令通常携带哪些参数?各有什么含义?
参考答案:
| 参数 | 含义 |
|---|---|
| app | 应用名称,服务端用于区分不同应用 |
| flashVer | Flash Player 版本号 |
| swfUrl | 发布 SWF 文件的 URL |
| tcUrl | 服务器 URL(rtmp://host:port/app) |
| fpad | 是否使用代理(布尔值) |
| capabilities | 客户端能力位图 |
| audioCodecs | 支持的音频编解码器 |
| videoCodecs | 支持的视频编解码器 |
| videoFunction | 支持的视频功能 |
| pageUrl | 加载 SWF 的网页 URL |
| objectEncoding | AMF 编码版本(0=AMF0,3=AMF3) |
26. 请描述 RTMP 协议中音频 Tag 的详细结构?
参考答案:
第 1 字节(SoundFormat + SoundRate + SoundSize + SoundType):
- 高 4 位:SoundFormat(编码格式)
- 10 = AAC
- 2 = MP3
- 0 = PCM 大端
- 接下来 2 位:SoundRate(采样率)
- 0 = 5.5kHz,1 = 11kHz,2 = 22kHz,3 = 44kHz
- 接下来 1 位:SoundSize(采样精度)
- 0 = 8-bit,1 = 16-bit
- 最低 1 位:SoundType(声道)
- 0 = 单声道,1 = 立体声
第 2 字节起(当 SoundFormat = 10 / AAC 时):
- 第 2 字节:AACPacketType
- 0 = AAC sequence header(AudioSpecificConfig)
- 1 = AAC raw(音频帧数据)
27. RTMP 视频 Tag 的详细结构?AVCPacketType 有哪两种?
参考答案:
第 1 字节(FrameType + CodecID):
- 高 4 位:FrameType
- 1 = keyframe
- 2 = inter frame
- 3 = disposable inter frame
- 4 = generated keyframe
- 5 = video info / command frame
- 低 4 位:CodecID
- 7 = AVC(H.264)
- 10 = HEVC(H.265,扩展)
第 2-4 字节(当 CodecID = 7 / AVC 时):
- 第 2 字节:AVCPacketType
- 0 = AVC sequence header(AVCDecoderConfigurationRecord,含 SPS/PPS)
- 1 = AVC NALU(视频帧数据)
- 2 = AVC end of sequence(序列结束)
- 第 3-4 字节:Composition Time(CTS,PTS - DTS,用于 B 帧显示时间偏移)
28. RTMP 协议是如何保证可靠性的?TCP 拥塞控制会对 RTMP 直播产生什么影响?
参考答案:
RTMP 基于 TCP,天然具备可靠传输特性:
- 确认重传:TCP 确认机制保证数据不丢
- 顺序保证:按序到达
- 流量控制:滑动窗口机制
- 拥塞控制:慢启动、拥塞避免、快重传、快恢复
对直播的影响:
- 网络抖动时:TCP 会重传丢失的包,导致延迟累积(延迟越来越大)
- 带宽不足时:TCP 拥塞控制会降低发送速率,造成音视频卡顿
- 直播场景痛点:TCP 的可靠传输机制反而可能导致延迟不可控(丢包不如延迟敏感)
- 解决方案:使用 QUIC/HTTP3 或基于 UDP 的协议(如 SRT、WebRTC)替代
29. RTMP 推流过程中,如果网络抖动导致数据积压,常见的处理策略有哪些?
参考答案:
-
丢帧策略:
- 丢弃非关键帧(P/B 帧),只保留关键帧
- 丢弃音频或视频的低优先级数据
- 动态调整编码码率
-
动态调整编码参数:
- 降低分辨率/码率
- 减小 GOP 长度,减少关键帧间隔
-
缓冲管理:
- 设置发送缓冲区上限,超过则丢帧
- 使用环形缓冲区,新数据覆盖旧数据
-
协议层面:
- 监测 RTT 和 ACK 频率,动态调整发送速率
- 使用 TCP_NODELAY 减少小包合并延迟
30. RTMP、RTSP、WebRTC 三种协议在实时互动直播场景下如何选型?
参考答案:
| 维度 | RTMP | RTSP + RTP | WebRTC |
|---|---|---|---|
| 延迟 | 1-3s | 1-2s | 100-500ms |
| 浏览器支持 | 需插件 | 需插件 | 原生支持 |
| 穿透能力 | 一般(1935) | 差 | 好(ICE/STUN/TURN) |
| 安全 | RTMPS/RTMPE | SRTP/DTLS | DTLS-SRTP |
| 复杂度 | 中等 | 中等 | 高 |
| 兼容性 | 直播 CDN 广泛支持 | 安防/监控领域 | 新兴,生态完善中 |
| 典型场景 | 直播推流/CDN | 摄像头/IPTV | 视频会议/互动直播 |
选型建议:
- 传统直播(一对多,秒级延迟可接受):RTMP 推流 + HLS/FLV 分发
- 超低延迟互动(毫秒级):WebRTC
- 安防/设备接入:RTSP + RTP
3314



被折叠的 条评论
为什么被折叠?



