直播录制
FFMPEG 可以录制网络直播流,支持多种流媒体协议和格式。
基础录制
简单录制
录制直播流并保存为本地视频文件。
bash
ffmpeg -i "http://example.com/live.flv" \
-c:v libx264 \
-c:a aac \
-strict experimental \
output.mp4实时录制(带缓冲)
使用 -re 参数以原始帧率读取输入,适合实时流。
bash
ffmpeg -re \
-i "http://example.com/live.flv" \
-vcodec libx264 \
output.mp4参数说明
-re: 以原始帧率读取输入(用于实时流)-i: 输入流地址(支持 http/https/flv/rtmp 等协议)-strict experimental: 允许使用实验性编码器(某些情况下需要)-c:v libx264: 视频编码为 H.264-c:a aac: 音频编码为 AAC
支持的流媒体协议
HTTP/HTTPS 流
bash
ffmpeg -i "http://example.com/live.m3u8" output.mp4
ffmpeg -i "https://example.com/live.flv" output.mp4RTMP 流
bash
ffmpeg -i "rtmp://example.com/live/stream" output.mp4RTSP 流
bash
ffmpeg -i "rtsp://example.com/live/stream" output.mp4UDP 流
bash
ffmpeg -i "udp://@:1234" output.mp4抖音直播录制
基础命令
bash
ffmpeg -re -i "http://pull-flv-l26.douyincdn.com/stage/stream-xxx.flv?expire=xxx&sign=xxx" \
-vcodec libx264 \
output.mp4完整示例
bash
# 抖音直播录制
ffmpeg -re \
-i "http://pull-flv-l26.douyincdn.com/stage/stream-113721505324466315_or4.flv?expire=650a8c69&sign=c22d29631385f2e09f7ce5e10950b003" \
-vcodec libx264 \
-c:a aac \
-b:v 2000k \
-b:a 128k \
/Users/ken/Downloads/output.mp4流媒体处理技巧
设置超时时间
避免网络问题导致程序卡死。
bash
ffmpeg -timeout 5000000 \
-i "http://example.com/live.flv" \
-c copy output.mp4自动重连
网络断开时自动重连。
bash
ffmpeg -reconnect 1 -reconnect_at_eof 1 \
-reconnect_streamed 1 \
-reconnect_delay_max 2 \
-i "http://example.com/live.flv" \
output.mp4参数说明
-reconnect 1: 启用自动重连-reconnect_at_eof 1: 在流结束时重连-reconnect_streamed 1: 流式传输时重连-reconnect_delay_max 2: 最大重连延迟(秒)
限制录制时长
录制指定时长的内容。
bash
# 录制 1 小时
ffmpeg -i "http://example.com/live.flv" \
-t 01:00:00 \
-c copy output.mp4分段录制
将长直播分段保存。
bash
# 每段 30 分钟
ffmpeg -i "http://example.com/live.flv" \
-c copy \
-f segment \
-segment_time 1800 \
-segment_format mp4 \
output_%03d.mp4推流到服务器
RTMP 推流
将本地视频推流到 RTMP 服务器。
bash
ffmpeg -re -i input.mp4 \
-c copy \
-f flv \
"rtmp://example.com/live/stream_key"推流并录制
同时推流和本地录制。
bash
ffmpeg -re -i input.mp4 \
-c copy \
-f tee \
-map 0:v -map 0:a \
"[f=flv]rtmp://example.com/live/stream_key|[f=mp4]local_output.mp4"流媒体信息查看
查看流信息
bash
ffprobe "http://example.com/live.flv"测试流是否可用
bash
ffmpeg -i "http://example.com/live.flv" -t 1 -f null -常见问题处理
1. 流连接失败
问题:无法连接到流地址
解决方案:
- 检查网络连接
- 验证流地址是否正确
- 检查防火墙设置
- 使用
-timeout设置超时
2. 录制卡顿
问题:录制过程中出现卡顿
解决方案:
- 使用
-c copy避免重新编码 - 增加缓冲区大小:
-bufsize 2M - 使用
-re参数同步帧率
3. 文件损坏
问题:录制的文件无法播放
解决方案:
- 使用
-c copy复制流而不是重新编码 - 确保流地址稳定
- 使用分段录制避免单文件过大
批量录制脚本
bash
#!/bin/bash
# 批量录制多个直播流
STREAMS=(
"http://example.com/stream1.flv"
"http://example.com/stream2.flv"
)
OUTPUT_DIR="./recordings"
mkdir -p "$OUTPUT_DIR"
for i in "${!STREAMS[@]}"; do
stream="${STREAMS[$i]}"
output="$OUTPUT_DIR/stream_$i_$(date +%Y%m%d_%H%M%S).mp4"
echo "开始录制: $stream"
ffmpeg -re -i "$stream" \
-c copy \
"$output" &
done
wait
echo "所有录制完成"注意事项
- 网络稳定性:确保网络连接稳定,避免中断
- 存储空间:直播录制会产生大量文件,注意磁盘空间
- 流地址有效期:某些平台的流地址有过期时间,需要及时更新
- 版权问题:录制他人直播需注意版权和法律问题
- 性能影响:长时间录制会占用系统资源,注意监控
下一步:学习音频处理相关内容。
