Skip to content

直播录制

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.mp4

RTMP 流

bash
ffmpeg -i "rtmp://example.com/live/stream" output.mp4

RTSP 流

bash
ffmpeg -i "rtsp://example.com/live/stream" output.mp4

UDP 流

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 "所有录制完成"

注意事项

  1. 网络稳定性:确保网络连接稳定,避免中断
  2. 存储空间:直播录制会产生大量文件,注意磁盘空间
  3. 流地址有效期:某些平台的流地址有过期时间,需要及时更新
  4. 版权问题:录制他人直播需注意版权和法律问题
  5. 性能影响:长时间录制会占用系统资源,注意监控

下一步:学习音频处理相关内容。