
RTMP 推流 VLC 拉流 实践步骤环境Ubuntu 24.04 Docker测试文件Big Buck Bunny (~/test_project/bbb_sunflower_1080p_30fps_normal.mp4)核心流程从视频文件抓取 → FFmpeg 推流 → VLC 拉流验证前置环境确认# 1. 确认 BBB 文件存在ls~/test_project/bbb_sunflower_1080p_30fps_normal.mp4# 2. 停掉旧的 SRS 容器避免端口冲突dockerstop srs2/dev/nulldockerrmsrs2/dev/nullStep 1启动 SRS 服务dockerrun--namesrs-d\-p1935:1935\-p1985:1985\-p8080:8080\registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5端口说明端口用途1935RTMP 推流/拉流1985SRS API调试用8080HTTP-FLV / HLS 拉流验证启动成功dockerps|grepsrs# 看到 Up 状态即正常dockerlogs srs--tail5# 看到 SRS/5.x.x started 即成功Step 2FFmpeg 从 BBB 文件抓取视频推 RTMP 流ffmpeg-re\-i~/test_project/bbb_sunflower_1080p_30fps_normal.mp4\-map0:v:0-map0:a:0\-c:vcopy-c:acopy\-fflv\rtmp://localhost:1935/live/bbb参数速查参数作用对应实践动作-re按视频真实帧率读取文件模拟实时采集抓取控制-i ~/test_project/bbb...mp4指定要抓取的 BBB 视频文件输入源-map 0:v:0 -map 0:a:0强制选第1个视频轨 第1个MP3立体声音轨轨道选择避坑 AC3-c:v copy -c:a copy音视频不重新编码直接抓取原始数据推送编码控制-f flvRTMP 协议必须用 FLV 封装输出格式rtmp://localhost:1935/live/bbbRTMP 服务器地址bbb是自定义流名推流地址成功标志终端持续刷帧speed1x按1倍速实时推流frame 1200 fps 30 q-1.0 size 90112kB time00:00:40.00 bitrate18432.0kbits/s speed1xStep 3VLC 拉 RTMP 流播放方式 1VLC 命令行最直接vlc rtmp://localhost:1935/live/bbb方式 2VLC 图形化打开 VLC → 「媒体」→「打开网络串流」输入 RTMP 拉流地址rtmp://localhost:1935/live/bbb点击「播放」看到 Big Buck Bunny 动画即成功方式 3VLC 拉 HTTP-FLV 流备用方案vlc http://localhost:8080/live/bbb.flv方式 4ffplay 快速验证无需 VLCffplay rtmp://localhost:1935/live/bbbStep 4停止服务# 1. 先停推流在 FFmpeg 运行的终端按 CtrlC# 2. 停 SRS 容器dockerstop srsdockerrmsrs进阶理解-re参数的本质为什么 speed 必须等于 1x-re让 FFmpeg按视频原始帧率读取文件。30fps 的视频FFmpeg 每秒只读 30 帧推送。没有-re会怎样FFmpeg 会尽可能快地读取并推送文件speed 可能达到几十甚至上百倍相当于快进推流问题具体表现SRS 缓存被打满推流速度远超播放速度SRS 接收缓冲区瞬间堆积触发丢包甚至断开连接拉流端播放异常数据涌入速度 消费速度 → 缓冲区溢出 → 卡顿、花屏失去实时模拟意义工程机械 IPC 是实时产生视频帧的推流速度必须 采集帧率验证方法观察 FFmpeg 输出中的speed1.00x指标接近 1x 即为实时推流。FLV 容器对音频编码的白名单限制RTMP 推流要求-f flv而 FLV 标准的音频编码白名单只有AAC、MP3、PCMμ-law/A-law。BBB 视频有 2 个音轨#0:1MP3FLV 支持、#0:2AC3FLV 不支持。FFmpeg 默认可能选中 AC3 音轨导致Audio codec ac3 not compatible报错。-map 0:a:0强制指定第 1 个音频轨MP3避开 AC3。如果要推 AC3 音轨必须先转码-c:a aac有损不能只用-c:a copy。故障排查方法论症状排查工具命令示例推流失败ffprobe分析源文件ffprobe -v error -show_streams input.mp4查看音视频轨信息推流失败docker logs srsdocker logs srs --tail 50查看 SRS 是否收到连接请求拉流黑屏浏览器 SRS 控制台http://localhost:8080/查看流是否在线延迟异常FFmpegdrawtext叠加时间戳-vf drawtexttext%{localtime}:x10:y10:fontcolorwhite对比推拉流两端时间协议交互异常Wireshark 抓包抓 1935 端口看 RTMP connect/publish/onStatus 报文延迟对比测试方法在 BBB 视频中叠加实时时间戳对比推流端时间和拉流端显示时间的差值ffmpeg-re-ibbb.mp4-map0:v:0-map0:a:0\-c:vcopy-c:acopy\-vfdrawtexttext%{localtime:%H:%M:%S}:fontsize48:fontcolorred:x10:y10\-fflv rtmp://localhost:1935/live/bbb_delay推流端 FFmpeg 日志的时间戳 vs 拉流端 VLC/浏览器画面中显示的时间戳差值即为端到端延迟。建议对比 RTMP、HTTP-FLV、RTSP 三种协议的延迟差异。总结项目内容服务器SRSDocker 一键启动推流协议RTMP-f flv端口 1935拉流协议RTMP / HTTP-FLV视频处理不转码-c:v copy -c:a copy纯复制VLC 兼容性✅ RTMP 和 HTTP-FLV 均完美支持RTMP 是 SRS 最成熟的协议推流/拉流都走 TCP 单连接最稳定、最易上手。互联网直播场景的首选。