FFmpeg录制RTMP流随机中断,如何实现自动无间隙续录?
解决方案
方法1:启用FFmpeg自动重连参数
针对RTMP流的间歇性中断,可通过FFmpeg内置的重连参数让程序自动尝试恢复连接,无需手动重启,同时减少录制间隙。修改后的命令如下:
ffmpeg -reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5 -i "rtmp://example.com/stream?id=12345" -vcodec copy -acodec copy "output.mp4"
各参数作用:
-reconnect 1:开启自动重连功能-reconnect_streamed 1:针对RTMP这类流式协议启用重连逻辑-reconnect_delay_max 5:设置最大重连等待间隔为5秒(避免长时间等待导致间隙过大)
如果流只是短暂中断,该参数能让FFmpeg自动重新接入流,继续录制到同一个文件中,无需生成多个片段。
方法2:循环录制独立片段+后期合并
若自动重连仍无法解决问题,可通过脚本循环执行录制命令,每次生成独立的片段文件,后续再合并为完整视频,彻底避免手动操作的间隙。
循环录制脚本(适用于Linux/macOS)
创建一个record_stream.sh脚本:
#!/bin/bash STREAM_URL="rtmp://example.com/stream?id=12345" COUNTER=1 # 无限循环录制 while true; do # 生成带序号的输出文件名 OUTPUT_FILE="output_$(printf "%04d" $COUNTER).mp4" # 执行录制命令 ffmpeg -hide_banner -loglevel error -i "$STREAM_URL" -vcodec copy -acodec copy "$OUTPUT_FILE" # 短暂延迟避免频繁连接服务器 sleep 0.1 # 计数器递增 COUNTER=$((COUNTER + 1)) done
给脚本添加执行权限:chmod +x record_stream.sh,运行即可自动循环录制。
合并片段
录制完成后,创建一个filelist.txt,列出所有片段文件:
file 'output_0001.mp4' file 'output_0002.mp4' file 'output_0003.mp4' ...
执行合并命令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy merged_output.mp4
方法3:优化脚本过滤短片段
为避免生成大量1-2秒的无效片段,可在脚本中检查录制文件的时长,仅保留有效片段:
#!/bin/bash STREAM_URL="rtmp://example.com/stream?id=12345" COUNTER=1 while true; do OUTPUT_FILE="output_$(printf "%04d" $COUNTER).mp4" ffmpeg -hide_banner -loglevel error -i "$STREAM_URL" -vcodec copy -acodec copy "$OUTPUT_FILE" # 使用ffprobe获取文件时长 DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$OUTPUT_FILE") # 过滤时长小于2秒的片段 if (( $(echo "$DURATION < 2" | bc -l) )); then rm "$OUTPUT_FILE" else COUNTER=$((COUNTER + 1)) fi sleep 0.1 done
内容的提问来源于stack exchange,提问作者M9A
相关产品推荐
相关产品推荐

