FFmpeg 直播推流


🎥 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

这里实现了边推流边本地录制的功能。


© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容