一、推流失败#
# ① 先确认端口通不通
telnet rtmp-server.com 1935
# ② 用 ffmpeg 命令行测试推流(排除代码问题)
ffmpeg -f lavfi -i testsrc -f flv rtmp://server/live/test
# 如果 ffmpeg 能推,你的代码不能,说明是代码问题
# 如果 ffmpeg 也不能推,说明是服务器/网络问题
二、画面花屏#
可能原因:
GOP 设置太大 → 播放器丢失了第一个 I 帧,后续 P 帧无法解码
解决方案:
- -g 15(每 15 帧插一个 I 帧)
- 播放器等待下一个 I 帧
- 推流开始时先发送一段静音帧让播放器稳定
H.264 sps/pps 丢失:
sps/pps 是 H.264 的解码配置,必须在第一个 I 帧之前发送
RTMP 连接时先发送 AVCDecoderConfigurationRecord(包含 sps/pps)
然后在每个关键帧前重复发送 sps/pps(称为"extra data")
三、音画不同步#
排查步骤:
1. 用 ffprobe 检查时间基是否一致
ffprobe input.mp4 -show_streams
看 video 和 audio 的 time_base
2. 检查是否有 B 帧导致 PTS/DTS 错位
ffprobe -show_frames input.mp4 | grep pict_type
如果有 B 帧,确保解码时按照 DTS 顺序,显示时按照 PTS 顺序
3. 检查 PTS 是否有跳变
打印每帧的 PTS,看是否单调递增
如果 PTS 回退或大幅跳变,说明时间戳设置有问题
4. 编码前后的 time_base 转换是否正确
av_packet_rescale_ts 必须使用正确的输入/输出 time_base
四、推流延迟大#
可能原因和解决方法:
问题:编码器缓冲太多帧(lookahead)
解决:-tune zerolatency, -rc_mode cbr
问题:GOP 太大(关键帧间隔太长)
解决:-g 15 或 -g 30
问题:B 帧引入延迟
解决:-bf 0(不用 B 帧)
问题:网络拥塞
解决:降低码率 -b:v 1000k(1Mbps)
使用 CBR(固定码率)而不是 VBR(可变码率)
问题:RTMP Chunk 大小设置不合理
解决:RTMP 默认 chunk_size = 128,不需要改