🎥 FFmpeg 直播推流介绍与实例
FFmpeg 不仅能用来处理本地音视频文件,它也是一款非常强大的 直播推流工具,广泛用于 RTMP、HLS、RTP、SRT 等多种直播协议的推拉流场景。
一、直播常用协议简介
| 协议 | 全称 | 特点 |
|---|---|---|
| RTMP | Real-Time Messaging Protocol | Adobe 开发,低延迟,适合推流到 CDN 或直播平台 |
| HLS | HTTP Live Streaming | 苹果开发,基于 HTTP,适合网页播放,有轻微延迟 |
| RTP/RTCP | Real-time Transport Protocol | 常用于内网传输,配合 SDP 使用 |
| SRT | Secure Reliable Transport | 安全可靠,抗丢包能力强,适合公网传输 |
二、推流的基本流程
采集源: 摄像头、屏幕、已有视频文件等
编码: 视频使用 H.264/H.265,音频使用 AAC/G.711 等
封装: FLV(RTMP)、MPEG-TS(HLS)、RTP 包等
传输: 推送到服务器或 CDN 地址(如 B站、抖音、OBS Server、Nginx-RTMP、SRS等)
三、常用编码器选项
| 参数 | 含义 |
|---|---|
-c:v libx264 |
视频编码为 H.264 |
-c:a aac |
音频编码为 AAC |
-pix_fmt yuv420p |
设置像素格式 |
-g 25 |
GOP 大小(每25帧一个关键帧) |
-b:v 1000k |
视频比特率 |
-b:a 128k |
音频比特率 |
-f flv |
输出格式为 FLV(用于 RTMP) |
四、直播推流常用命令示例
✅ 示例 1:从摄像头+麦克风进行直播推流(RTMP)
ffmpeg -f dshow -i video="Integrated Camera" -f dshow -i audio="麦克风 (Realtek Audio)"
-c:v libx264 -preset ultrafast -pix_fmt yuv420p
-c:a aac -b:a 128k
-f flv rtmp://live.pushserver.com/app/streamname
Windows 上使用
dshow设备采集摄像头和麦克风。macOS 可以使用-f avfoundation,Linux 使用-f v4l2。
✅ 示例 2:屏幕录制并推流到 RTMP 服务器
ffmpeg -f gdigrab -framerate 30 -i desktop
-c:v libx264 -r 30 -preset ultrafast -pix_fmt yuv420p
-c:a aac -b:a 128k -f flv rtmp://live.pushserver.com/app/streamname
-f gdigrab 表示 Windows 屏幕捕捉;
macOS 使用 avfoundation,语法类似:
ffmpeg -f avfoundation -video_size 1920x1080 -r 30 -i 1:none
-c:v libx264 -preset ultrafast -pix_fmt yuv420p
-c:a aac -b:a 128k
-f flv rtmp://live.pushserver.com/app/streamname
✅ 示例 3:从本地视频文件循环推流(模拟直播)
ffmpeg -stream_loop -1 -i input.mp4
-c:v libx264 -c:a aac -f flv rtmp://live.pushserver.com/app/streamname
-stream_loop -1 表示无限循环播放该视频。
✅ 示例 4:推流到 YouTube 直播
YouTube 的推流地址格式如下:
rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY
推流命令如下:
ffmpeg -re -i input.mp4
-c:v libx264 -preset veryfast -maxrate 4M -bufsize 8M
-c:a aac -ar 48000 -b:a 128k
-f flv "rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY"
-re 表示按照原始帧率读取输入;
libx264 编码;
preset veryfast 平衡速度与压缩质量;
推流地址请替换为你的 YouTube 流密钥。
✅ 示例 5:推流到 Bilibili(B站)
B站提供专属的推流地址和流密钥(Stream Key),一般为:
rtmp://live-push.bilivideo.com/live-api/stream?
完整推流命令:
ffmpeg -re -i input.mp4
-c:v libx264 -preset fast -pix_fmt yuv420p
-c:a aac -b:a 128k -ar 48000
-f flv "rtmp://live-push.bilivideo.com/live-api/stream?streamKey=你的流密钥"
五、调试与查看推流信息
你可以加上一些调试参数,便于查看当前推流状态:
ffmpeg -loglevel verbose ...
或者只显示进度:
ffmpeg -hide_banner -progress pipe:1 ...
六、常见问题排查建议
推流失败?
检查 RTMP 地址是否正确
检查防火墙是否限制端口(默认 1935)
查看服务器日志或使用 Wireshark 抓包分析
音频不同步?
添加 -async 1 自动调整音频同步
尝试重新采样:-ar 48000
画面模糊?
提高视频比特率(-b:v 3M)
使用更高质量预设(-preset slow)
七、拓展:推流 + 录制双输出(同时保存本地录像)
ffmpeg -f dshow -i video="Integrated Camera" -f dshow -i audio="麦克风 (Realtek Audio)"
-c:v libx264 -preset ultrafast -pix_fmt yuv420p
-c:a aac -b:a 128k
-f flv rtmp://live.pushserver.com/app/streamname
-c copy local_record.flv
这里实现了边推流边本地录制的功能。






![解决 Android studio 代理 Connect to 127.0.0.1:[/127.0.0.1] failed: Connection refused - 宋马](https://pic.songma.com/blogimg/20251026/d2399f61e1834534a1779c69f5487a53.jpg)














暂无评论内容