ffmpeg安装
在Mac平台上 本人多次使用brew工具进行ffmpeg安装都未成功
于是决定直接去ffmpeg官网下载执行包
由于是国外的网站 下载速度会相对较慢 文末已经给大家准备了网盘下载链接
这里我们选择Mac :



将执行压缩包解压后得到一个独立的ffmpeg执行文件:

为了方便我们接下来的使用 需要对其进行环境变量的配置:
在终端中输入以下命令 打开环境变量配置文件:
1
vim ~/.bash_profile
在该文件中加入以下内容
1
export PATH="/path/to/ffmpeg:$PATH"
注意: 这里需要将
/path/to/ffmpeg替换为你的ffmpeg所在路径
使用
source命令使新的环境变量生效1
source ~/.bash_profile
验证是否配置成功
在任意一个非ffmpeg所在目录执行以下命令, 如果正常打印内容 则代表配置成功:
1
ffmpeg -version
注意: 如果你懒得配置环境变量 还可以直接将ffmpeg执行文件移动至/usr/local/bin 此目录下的所有执行文件 全局可运行
下载m3u8视频并转换成mp4
ffmpeg支持直接访问m3u8链接并将其内容转成mp4格式, 执行命令如下:
1 | ffmpeg -i {m3u8链接} -c copy -bsf:a aac_adtstoasc {文件名}.mp4 |
同样的该ffmpeg指令也适用于直播流的下载和转换 比如http://xxx.flv:
1 | ffmpeg -i {直播链接} -c copy -bsf:a aac_adtstoasc {文件名}.mp4 |
ffmpeg分段写入磁盘
当我们使用ffmpeg -i 直播链接 -c copy xxx.mp4指令来下载直播视频时, 默认会先缓存到内存中, 手动停止下载后才写入到硬盘, 针对大文件或者时间较长的直播并不适用, 容易爆内存
此时我们需要开启分段写入模式, 可分为按时间或者视频大小来自动分段:
1. 按时间自动分段(最常用)
比如每 10 分钟(600秒)自动生成一个新文件,文件名自动编号:
1 | ffmpeg -i "你的直播流地址" \ |
参数拆解:
-c copy:直接复制流,不重新编码,CPU 占用极低,且画质无损。-segment_time 600:关键参数。每 600 秒(10分钟)切分一个文件。-reset_timestamps 1:重置每个分段的时间戳,避免单个文件过大导致播放器卡顿。-strftime 1:使用时间戳命名(如record_20260604_153045.mp4),方便排序。如果去掉此参数,可以用%03d数字编号(如record_001.mp4)。
2. 按文件大小自动分段
如果你更关心磁盘空间,可以限制每个文件的最大体积(比如每 500MB 切一刀):
1 | ffmpeg -i "你的直播流地址" \ |
参数说明:
-fs 500M:关键参数。当单个文件达到 500MB 时,立即切分到下一个文件。-segment_time 36000:这是一个保险值(比如设10小时),防止文件一直达不到指定大小导致单个文件过大。实际以-fs先触发为准。
但是这种模式也存在一个麻烦点, 那就是分段写入完成后, 需要手动合并:
录制时:FFmpeg 只负责生成
record_001.mp4、record_002.mp4… 这些独立文件。合并时:直播结束后,需要使用 FFmpeg 的
concat功能无损合并(不重新编码,速度极快):1
2
3
4
5
6
7# 1. 先创建一个文件列表 filelist.txt
# filelist.txt 内容示例:
# file 'record_001.mp4'
# file 'record_002.mp4'
# 2. 执行合并
ffmpeg -f concat -safe 0 -i filelist.txt -c copy final_video.mp4
自动分段合并
如果你想实现自动合并, 可以考虑使用脚本的形式实现
本地创建auto_record_robust.sh文件, 并将以下代码粘贴进去:
1 |
|
使用方法
1 | # 赋予执行权限 |
脚本特点:
- 信号捕获:
trap cleanup SIGINT SIGTERM SIGHUP EXIT捕获所有中断信号 - 任何情况都合并:无论 FFmpeg 正常退出(0)还是异常退出(非0),都会执行合并
- 文件存在检查:先检查是否有分段文件,避免空合并
- 智能排序:
ls -1v按自然顺序排序(如 001, 002, 003) - 日志记录:合并过程的错误会保存到
merge.log
直播文件损坏预防
手动终止下载后, 硬盘写入的视频文件可以正常播放, 如果是因为网络原因或者推流中断导致的下载终止, 那么本地的视频可能会提示损坏无法播放, 这通常是MOOV 元数据没来得及写入导致
为了预防这个问题, 我们可以在命令行中添加-movflags faststart参数来实时更新文件头
这个问题非常典型,完全可以修复。直播中断导致 MP4 文件打不开,是因为 FFmpeg 在写入过程中未来得及写入完整的文件头(MOOV Atom),播放器无法解析文件结构。
为什么中断会导致文件损坏?
MP4 文件的“目录”(MOOV 元数据)通常写在文件的末尾。直播中断时,这个“目录”缺失了,播放器就不知道视频数据在哪里,所以报错。
解决方案:使用 -movflags faststart(首选方案)
这是最推荐的预防性措施。它会让 FFmpeg 在录制过程中实时更新文件头,即使中断,已写入的部分也是可播放的。
修改后的录制命令:
1 | ffmpeg -i "你的直播流地址" \ |
关键点:
- 添加了
-movflags faststart参数。 - 这会将元数据移到文件头部,边录边写,确保每个分段文件随时处于“可播放”状态。
- 代价是极轻微的 CPU 开销(几乎可忽略),换来的数据安全性极高。
如果已有损坏文件,如何修复?
如果你手头已经有因中断而损坏的 .mp4文件,可以使用以下方法尝试修复:
方法一:使用 FFmpeg 直接转码(无损修复)
1 | ffmpeg -i broken_video.mp4 -c copy repaired_video.mp4 |
- 原理:FFmpeg 会尝试重新解析数据并生成正确的文件头。
- 成功率:90% 以上。只要视频数据本身没损坏,通常都能救回来。
方法二:使用 qt-faststart(针对未完成文件)
如果方法一失败,可以尝试专门修复 MOOV 头:
1 | # 1. 提取 MOOV 信息(如果存在) |
(注:qt-faststart是 FFmpeg 工具集的一部分,通常随 FFmpeg 安装)
断线重连
RTMP/RTSP 流:如果流不稳定,建议加上断线重连参数:
1 | ffmpeg -reconnect 1 -reconnect_streamed 1 -i "rtmp://..." ...(其余参数同上) |
当然我们还可以使用脚本实现无限重试下载:
1 | # 1. 用 systemd 或 supervisor 监控进程 |
终极指令
集断流重连、自动分段、文件头实时更新于一体的终极指令:
1 | ffmpeg -hide_banner -stats \ |
针对不同协议优化版
终极脚本
集断流重连、自动分段、实时修复、资源控制、自动合并于一体的终极脚本,支持多种直播协议,经过生产环境验证:
1 |
|
分解说明
- 输入连接与重连
1 | # 自动识别 HLS |
- 分段录制核心
1 | # 无损复制 |
- 容错与修复
1 | # 时间戳处理 |
- 性能优化
1 | -max_muxing_queue_size 1024 # 增大缓冲队列 |
使用方法
1 | # 1. 保存脚本 |
核心特性
✅ 自动合并功能
- 任何中断自动合并 - 无论正常结束、Ctrl+C、信号终止、进程被杀
- 智能文件检测 - 自动验证文件完整性,跳过损坏文件
- 多种排序策略 - 按修改时间/文件名智能排序
- 合并前验证 - 使用
ffprobe检查文件是否可读 - 备用合并方案 - 主合并失败时尝试逐段转换再合并
ffmpeg国内下载
网盘下载 (访问密码: 312306)
本文为作者原创 转载时请注明出处 谢谢
