untrunc:免费修复截断 MP4 的完整指南,3 条命令跑通
【免费下载链接】untruncRestore a truncated mp4/mov. Improved version of ponchio/untrunc项目地址: https://gitcode.com/gh_mirrors/un/untrunc
视频突然黑屏,或播放器直接报"文件损坏",但你确定它上次还正常播放——这多半不是画面没了,而是 MP4 文件被截断了。untrunc 就是干这件事的免费开源工具:拿一段同设备的健康视频当模板,重建损坏视频的文件索引,恢复可播放,全程不重新编码。本文先带你在几分钟内跑通第一次修复,再讲原理和失败对策。
01 安装 untrunc 并跑通第一条修复命令
🔧 全程就三步:装工具、备好两段视频、跑一行命令。
Linux 上最快的路线是先装 ffmpeg 开发库,再源码编译:
sudo apt-get install libavformat-dev libavcodec-dev libavutil-dev git clone https://gitcode.com/gh_mirrors/un/untrunc cd untrunc make sudo cp untrunc /usr/local/bin如果系统里的 ffmpeg 版本和 untrunc 不兼容,可以让 Makefile 自行下载并编译作者验证过的 ffmpeg 3.3.9:
sudo apt-get install yasm wget make FF_VER=3.3.9 sudo cp untrunc /usr/local/binmacOS(Homebrew)用户先装依赖,编译时显式指定头文件与库路径:
brew install ffmpeg yasm export PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig" CPPFLAGS="-I/opt/homebrew/include" LDFLAGS="-L/opt/homebrew/lib" makeWindows 直接用项目发布的预编译包即可(含 GUI 版);仓库附带 Dockerfile,挂载本地视频目录就能跑,不用装任何环境:
docker build -t untrunc . docker run --rm -v ~/Videos/:/mnt untrunc /mnt/ok.mp4 /mnt/broken.mp4修复命令本身只有一行,健康文件在前、损坏文件在后:
untrunc /path/to/ok.mp4 /path/to/broken.mp4成功后同目录会生成broken_fixed.mp4,原文件全程只读、不会被改动。
02 untrunc 修复原理与哪些文件修不了
MP4 文件由一个个"原子(atom)"组成:mdat原子装真实的画面与音频数据,moov原子装索引——每一帧在哪、多长、什么顺序。断电、拔卡、传输中断这类最常见的损坏,结局基本一致:数据完好,索引丢了,播放器照着坏目录找,自然什么都播不出来。
untrunc 的思路像货物发运清单:货都在,只是清单丢了。它从同设备的健康文件里提取编码特征(分辨率、帧率、切片结构)当模板,逐字节重新匹配损坏文件,把索引和轨道结构重建出来。不解码、不重编码,所以没有画质损耗。
能处理的情况:
- 录制被截断、moov 缺失或损坏,但 mdat 数据仍在
- MP4、M4V、MOV、3GP 等常见容器
- H.264/AVC 编码(逻辑在
src/avc1/)与 HEVC/H.265 编码(src/hvc1/) - GoPro、索尼 XAVC 等特殊格式;索尼录制中 RSV 文件(
-rsv-ben,逻辑在src/rsv.cpp)
硬性前提:参考文件必须与损坏文件"健康且相似"——同设备、同分辨率帧率、录制时间尽量接近。参数差得远,匹配模板本身就不可靠,再多的参数也救不回来。
救不回来的情况:画面数据已被其他内容覆盖、存储介质物理读失败、或数据段本身大面积损坏。这类问题不是"结构坏了",而是"数据没了"。
与原版 ponchio/untrunc 相比,这个分支速度快 10 倍以上,内存占用更低,支持 2GB 以上的大文件,能跳过未知字节序列,并兼容新版 ffmpeg。
03 untrunc 参数速查表:按 6 种"什么时候用"场景找
参数看着多,按"什么情况下会用到"分组,一眼就能定位:
第一次命令失败,先定位卡点
| 参数 | 作用 |
|---|---|
-v/-vv | 输出详细日志,报问题时必加 |
-a | 进入交互式分析,逐步检查文件结构 |
-q/-w | -q只显示错误;-w显示隐藏的警告 |
参考文件不完全匹配时,调整匹配行为
| 参数 | 作用 |
|---|---|
-s/-st <步长> | 跳过未知字节序列而不中断,步长可调 |
-sm | 即使找不到 MP4 结构也强制搜索 mdat |
-dcc | 跳过"块必须在 mdat 内部"的检查 |
-dyn | 启用动态统计辅助匹配 |
修复后音画不同步或时间戳异常时
| 参数 | 作用 |
|---|---|
-sv | 拉伸或压缩视频,使其与音频时长一致 |
-noctts | 不恢复 ctts(解码时间偏移) |
控制输出与内存占用时
| 参数 | 作用 |
|---|---|
-dst <目录\|文件> | 指定输出目录或文件名 |
-dw | 不写出 _fixed 文件,只做分析 |
-dr | 将修复后的各轨道拆分落盘(隐含-dw) |
-skip | 跳过已存在的输出文件 |
-mp <字节数> | 限制最大分块尺寸,压低内存峰值 |
只想体检、不修文件时
| 参数 | 作用 |
|---|---|
-it/-ia/-is | 查看轨道信息 / 原子结构 / 统计信息 |
-f | 扫描全部原子并检查长度是否合法 |
-lsm | 定位文件中所有 mdat、moov 位置 |
-m <偏移量> | 针对指定偏移做匹配分析 |
特殊格式与文件重组
| 参数 | 作用 |
|---|---|
-rsv-ben | 索尼 RSV 录制中文件专用恢复模式 |
-u <mdat文件> <moov文件> | 将分离的 mdat 与 moov 片段拼回一个文件 |
-ms | 转换为可流式播放的布局 |
-range <A:B> | 只处理指定字节范围 |
04 untrunc 常见修复失败场景:5 种应对
⚠️ 多数"修不好"不是工具不行,而是参考文件没选对,或少了一个参数。
04.1 程序报错,没有输出文件
先加-v看日志,定位卡在哪一步。卡在匹配环节,基本就是参考文件不匹配:用ffprobe对比两个文件的分辨率、帧率、profile,对不上就换一段同设备的参考。
04.2 修复出来的文件仍然播不了
先确认参考文件与损坏文件同设备、同分辨率帧率;结构损坏较重的,用-sm强制搜索 mdat,或-s跳过未知片段。
04.3 修复后音画不同步
加-sv让视频时长向音频靠拢;同时换一段录制时间更接近的参考文件,往往更立竿见影。
04.4 完全没有参考视频
先用-lsm看损坏文件里能否定位 mdat/moov,再用-sm强制搜索。都走不通时,只能找同型号设备的视频,或之前发过给别人、存过备份的副本。
04.5 文件几个 GB,担心内存不够
该分支已优化内存并支持 2GB 以上文件;想进一步压低峰值,用-mp <字节数>限制分块尺寸。
05 untrunc 进阶用法:把视频体检和流式重组也交给它
重要素材归档前,可以跑一遍 untrunc 的分析模式做体检:-it -ia查看轨道与原子结构,-f扫描所有原子长度,专门揪出"还没坏透但已经埋下隐患"的文件。
遇到 mdat 和 moov 分属两个文件的极端情况,-u可把两者直接拼回完整文件;要在网页端丝滑播放的录像,用-ms一步转成流式友好布局。GUI 版已包含在 Windows 预编译包里,其他系统想自己编译的话,源码在src/gui/,装好 libui 依赖后执行make untrunc-gui即可。
06 一条值得养成的修复习惯:先备份,再谈修复
untrunc 只在"数据还在"时有效。一切修复的前提,是画面数据没有被覆盖——所以正确顺序是:先停止向那块存储写入,复制一份损坏文件,再找同设备的健康视频跑修复。
重要素材保持两份不同介质的副本(本地硬盘加网盘,或两块硬盘异地);归档前顺手跑一次-f体检。真出事故的时候,决定成败的就是这套习惯在不在。
【免费下载链接】untruncRestore a truncated mp4/mov. Improved version of ponchio/untrunc项目地址: https://gitcode.com/gh_mirrors/un/untrunc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考