FFmpeg 是流媒体处理的重要工具,支持 RTMP、HLS、DASH 等多种流媒体协议。
推流到 RTMP 服务器
基本推流命令
bash# 推送本地文件到 RTMP 服务器 ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream_key # 实时编码推流 ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key
摄像头/麦克风实时推流
bash# macOS 摄像头推流 ffmpeg -f avfoundation -i "0" -c:v libx264 -preset veryfast -b:v 1500k -f flv rtmp://server/live/stream_key # 摄像头+麦克风推流 ffmpeg -f avfoundation -i "0:0" -c:v libx264 -preset veryfast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key
HLS 流媒体生成
生成 HLS 流
bash# 生成 HLS 播放列表 ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 output.m3u8 # 生成多码率 HLS ffmpeg -i input.mp4 \ -vf scale=1920:1080 -c:v libx264 -b:v 5000k -f hls -hls_time 10 hls_1080p.m3u8 \ -vf scale=1280:720 -c:v libx264 -b:v 2500k -f hls -hls_time 10 hls_720p.m3u8 \ -vf scale=854:480 -c:v libx264 -b:v 1000k -f hls -hls_time 10 hls_480p.m3u8
HLS 参数说明
-hls_time:每个分片的时长(秒)-hls_list_size:播放列表中保留的分片数量(0 表示全部保留)-hls_segment_filename:分片文件命名模板-hls_flags:HLS 特殊标志(如 delete_segments、append_list)
DASH 流媒体生成
生成 DASH 流
bash# 生成 DASH 清单文件 ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f dash -seg_duration 10 output.mpd # 生成多码率 DASH ffmpeg -i input.mp4 \ -vf scale=1920:1080 -c:v libx264 -b:v 5000k -f dash -seg_duration 10 dash_1080p.mpd \ -vf scale=1280:720 -c:v libx264 -b:v 2500k -f dash -seg_duration 10 dash_720p.mpd
拉流处理
从 RTMP 拉流
bash# 拉取 RTMP 流并保存 ffmpeg -i rtmp://server/live/stream -c copy output.mp4 # 拉取 RTMP 流并转码 ffmpeg -i rtmp://server/live/stream -c:v libx264 -preset fast -b:v 1500k -c:a aac -b:a 128k output.mp4
从 HLS 拉流
bash# 下载 HLS 流 ffmpeg -i http://server/live/stream.m3u8 -c copy output.mp4 # 实时播放 HLS 流 ffmpeg -i http://server/live/stream.m3u8 -f null -
流媒体优化
延迟优化
bash# 低延迟推流 ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key # 使用 GOP 缓存 ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -g 25 -keyint_min 25 -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key
码率控制
bash# CBR(恒定码率) ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 1500k -maxrate 1500k -minrate 1500k -bufsize 3000k -f flv rtmp://server/live/stream_key # VBR(可变码率) ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -crf 23 -maxrate 3000k -bufsize 6000k -f flv rtmp://server/live/stream_key
常见流媒体协议
| 协议 | 用途 | 特点 |
|---|---|---|
| RTMP | 实时推流 | 低延迟,广泛用于直播 |
| HLS | HTTP 直播 | 兼容性好,支持自适应码率 |
| DASH | HTTP 直播 | 开放标准,跨平台支持 |
| RTSP | 实时流协议 | 用于监控和 IPC |
| UDP/RTP | 实时传输 | 低延迟,适合局域网 |
流媒体处理时,需要根据网络条件、延迟要求和目标平台选择合适的协议和编码参数。