免费 MP4 视频修复工具 Untrunc:3 条命令救回无法播放的录像
【免费下载链接】untruncRestore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video.项目地址: https://gitcode.com/gh_mirrors/unt/untrunc
刚还能放的视频突然打不开了?Untrunc 是一款免费开源的 MP4 视频修复工具,你只需递给它一段正常的参考视频,它就能重建损坏文件的索引结构,让录像重新播放。
谁会用得上:MP4 视频无法播放的 4 种场景
对照一下下面几种情况,命中任意一条就值得继续看:
- 监控录像因断电打不开,存储卡还在
- 相机拍旅行视频拍到一半中断(没电、SD 卡满)
- 文件拷进硬盘时损坏,变成「截断的 MP4 文件」
- moov 缺失导致视频无法播放,播放器直接报文件损坏
这四种情况的共同点是:画面和声音数据大多还在,坏掉的只是文件的「目录」。这正是 Untrunc 修复 MP4 视频要解决的问题,而一般的数据恢复软件并不管这个。
能力速览:Untrunc 能做什么
- 结构重建:以参考视频为模板重写字节级索引(moov),直接产出新的可播放文件
- 多格式覆盖:mp4、m4v、mov、3gp 四种容器,m4a 纯音频也能用同样思路尝试
- 多定位策略:内置 4 种 mdat 数据起始位置查找策略,失败后自动换一种重试
- 诊断能力:
-i查看容器原子结构、-a分析参考视频是否健康,修复前先验证 - 零配置运行:项目自带 Dockerfile,不用手动折腾 libav 依赖
从 0 到跑通:Untrunc 安装步骤(含 Docker 一行命令)
运行前准备好两个文件:一段来自同设备、同设置的正常参考视频,和那个损坏的目标文件。
- 拉取源码:
# 注释:下载 untrunc 项目并进入目录 git clone https://gitcode.com/gh_mirrors/unt/untrunc cd untrunc- 构建镜像,这一步把所有依赖一次编译到位,产物很小:
# 注释:本地构建 untrunc 镜像 docker build -t untrunc .- 执行第一次修复,把两个视频所在目录挂载进容器,参数顺序是好的在前、坏的在后:
# 注释:容器内执行修复,输出名为 broken_fixed.mp4 docker run -v /path/to/videos:/files untrunc /files/good.mp4 /files/broken.mp4- 不想用 Docker 的话,需先源码编译 libav 再用 g++ 链接,完整参数见 Dockerfile 与 README.md,macOS 还要追加 -framework 系列参数。
核心操作与参数速查:untrunc 命令一览表
主命令固定接两个文件参数:untrunc good.mp4 broken.mp4,顺序不能反。输出默认落在损坏文件旁的xxx_fixed.mp4,不指定就不改名。只给一个文件配合-i或-a,则是纯分析模式,不动原文件。
| 参数 | 作用 | 示例 |
|---|---|---|
-o | 指定输出文件名 | untrunc -o fix.mp4 good.mp4 broken.mp4 |
-i | 打印编码与原子结构信息 | untrunc -i good.mp4 |
-a | 分析参考视频本身是否健康 | untrunc -a good.mp4 |
-v | 输出详细日志,方便定位卡在哪 | untrunc -v good.mp4 broken.mp4 |
-M | 搜索可能的数据包起始位置 | untrunc -M good.mp4 broken.mp4 |
-d | 尝试纠正音视频漂移 | untrunc -d good.mp4 broken.mp4 |
常用组合是先加-v看流程走到哪一步停住,再按报错挑对应的策略参数重试。
踩坑排查:修复失败的 4 种报错应对
提示 Failed recovering the file,没有输出文件
现象:命令跑完报这个错,目录里没有 _fixed.mp4。 原因:没定位到 mdat 内容起点,或参考视频与损坏视频不匹配。 解法:换同设备同批次的参考视频,再试-M搜索包起始位置。
修出来了,但花屏或音画不同步
现象:能播放,几秒后画面成马赛克,或声音对不上嘴。 原因:参考视频与损坏视频分辨率、帧率不一致,模板对不上。 解法:重新挑参数一致的参考视频,加-d尝试纠正漂移。
本地编译报一堆 undefined reference
现象:链接阶段报 undefined reference to 'BZ2_bzDecompressInit' 之类。 原因:untrunc 依赖 libav 内部头文件,系统开发包符号不全。 解法:别硬啃本地编译,直接用自带 Dockerfile 构建;必须编译就按 README 补 -lbz2、-llzma 等参数。
修复后只能播放开头几秒
现象:开头能放,随后卡死,或成品明显比原文件短。 原因:损坏文件首个 mdat 是无效的,或尾部数据真的丢了。 解法:试-m沿用参考文件相同偏移,或拿同设备短片段做参考。
它凭什么能行:MP4 修复原理一句话讲透
把一个 MP4 文件想象成快递包裹:里面装的是画面和声音数据(叫 mdat),外面贴的「面单」是 moov 原子,记录着每一帧数据存在哪个位置。截断损坏的 MP4 文件里,包裹内容还在,面单却没了——播放器找不到入口,只好报文件损坏。
Untrunc 不拆包裹。它拿完好包裹的面单当模板,在损坏文件里扫描内容实际从哪开始,再按那个位置重写一份新的面单。修复逻辑 mp4.cpp 里 4 种 mdat 起点查找策略,对应的就是取第一个、与参考同偏移、按签名搜索、取最后一个这四种情形。
原子层面的解析交给 atom.cpp,同目录二十个 codec_*.cpp 分别认识 H.264、HEVC、AAC 等格式。参考视频务必尽量来自同一台设备,说白了就是「包装规格」相同,模板才能直接套用。
项目亮点 & 社区动态:协议、平台与贡献入口
- 协议:GPL v2,全文见 COPYING,商用、修改、再分发都不受限
- 跨平台:Linux、macOS 原生可编译;有 Docker 的平台(含 Windows)都能直接跑
- 镜像精简:Dockerfile 采用两阶段构建,最终镜像里只有可执行文件
- 附加工具:moovfirst/ 子目录可把 moov 原子挪到文件开头,利于边下边播
- 社区:项目已存在十余年,更新少但稳定;作者明确欢迎把修不好的损坏样本发去做分析,这也是门槛最低的贡献入口
遇到坏视频时,先备份原件,再跑一次 Untrunc 的 MP4 视频修复,三分钟的事。修成了把结果交给家人,修不成把样本反馈给社区,也算为下一个人铺了路——数据还在,值得抢救一次。
【免费下载链接】untruncRestore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video.项目地址: https://gitcode.com/gh_mirrors/unt/untrunc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考