乐闻世界logo
搜索文章和话题

如何使用 FFmpeg 进行 RTMP 推流和 HLS/DASH 流媒体生成?

2月18日 11:05

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实时推流低延迟,广泛用于直播
HLSHTTP 直播兼容性好,支持自适应码率
DASHHTTP 直播开放标准,跨平台支持
RTSP实时流协议用于监控和 IPC
UDP/RTP实时传输低延迟,适合局域网

流媒体处理时,需要根据网络条件、延迟要求和目标平台选择合适的协议和编码参数。

标签:FFmpeg