文档目录

一、推流失败

# ① 先确认端口通不通
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,不需要改