从 炸掉的 Kazam .movie.mux
里把视频救回来
适用:Kazam 录屏未正常结束后,仅留下一个巨大的
*.movie.mux
与一个 0B 或可播放的 MP4。
环境:Ubuntu 20.04(其它 Linux 亦可参考),Kazam,FFmpeg,Perl。
成果:成功恢复完整视频画面(如有音频且未完全损坏,也尽力修复并合成)。
文末附:一键脚本、常见报错逐条解决、预防建议(更稳定的录屏方案)。
目录
背景与问题现象
一次长时间录屏后,Kazam 没有正常“终结”(Finalize),目录里留下:
kazam__qgjsngj.movie # 很小(甚至 0 字节)的索引文件
kazam__qgjsngj.movie.mux # 非常大的原始流(例如 2GB)
Kazam_screencast_00000.mp4 # 体积很小,不可播放
症状:用 FFmpeg/VLC 直接打开 .movie.mux
报错:
Invalid data found when processing input
- 或 EBML/Matroska 头解析失败等。
这是一开始完成录制后产生的三个文件,当然你也可能没有这个.mp4文件也是正常的
可以看到内存大小差异显著,我录制了大概15分钟,所以视频真正应该在.movie.mux文件里面
结论:数据很可能还在 .movie.mux
里,但缺失了“可播放所需的结构/索引”。需要重新构建头信息并把音视频重新封装(remux)。
原理简述:.movie.mux
是什么
.movie.mux
是 Kazam/GStreamer 管线在录制过程中的原始复用数据流,通常包含- H.264(视频裸流)
- AAC(音频裸流,可能是 ADTS 或其他封装)
当你点击“保存”为 MP4 时,Kazam 会把这些原始流封装进 MP4 容器,并写入 moov(索引/目录)等关键原子。
若在终结前崩溃/卡死/关机,就只剩下
.movie.mux
—— 原料在,但没有成品 MP4 的索引。
两条恢复路线
快速版:一键脚本(推荐推荐推荐)
思路:准备一个“同设置短参考视频”(几秒钟,正常保存为 MP4)→ 用 mp4fixer 借用参考文件的头信息解析
.mux
→ 导出*.h264/*.aac
裸流 → 用 FFmpeg 无损封装为 MP4。
强烈建议直接跑脚本,然后按输出提示做小修整。
准备动作(关键)
用与出问题时完全相同的 Kazam 设置(分辨率/帧率/是否录音/编码)录 5–10 秒,正常保存到问题文件同目录,命名为:
/media/yao/H/Research/RoboMaster2025-Dataset/good_ref.mp4
记住一定要有MP4文件存在,我是直接将另一个完好的MP4文件直接改名(一定要名称改的相同)
创建保存并执行一键脚本:见文末 附录A。
注意脚本中的文件路径一定要修改为自己的实际路径
脚本运行时是这样,时间比较久,特别是你的视频本身比较大的时候,耐心等待
视频短的话会快很多
教科书版:逐步手工操作
假定工作目录:
/media/yao/H/Research/RoboMaster2025-Dataset
1)备份原件
cd /media/yao/H/Research/RoboMaster2025-Dataset
cp -n kazam__qgjsngj.movie.mux kazam__qgjsngj.movie.mux.bak
2)安装依赖
sudo apt update
sudo apt install -y perl ffmpeg git gcc libfaad-dev
3)准备参考视频 good_ref.mp4
与出问题时参数一致(分辨率/帧率/音频),录 5–10 秒,正常保存到当前目录。
4)获取 mp4fixer
git clone https://github.com/bookkojot/mp4fixer.git
5)运行修复,导出裸流
perl mp4fixer/fixer.pl good_ref.mp4 kazam__qgjsngj.movie.mux recovered
预期会得到:
recovered-out-video.h264
recovered-out-audio.aac 或 recovered-out-audio.raw
recovered-headers.aac # 头信息
6)合成 MP4
若得到
*.aac
(ADTS):ffmpeg -framerate 20 -i recovered-out-video.h264 -i recovered-out-audio.aac -c copy recovered_video.mp4
注意把
-framerate
替换成参考视频的真实帧率(如 30/60)。若只有
*.raw
:先补 ADTS 再合成
方法A(用仓库工具aacfixer
,有些系统可能 segfault,见下节):(cd mp4fixer && gcc aac.c -L. -lfaad -lm -o aacfixer) ./mp4fixer/aacfixer recovered-headers.aac recovered-out-audio.raw ffmpeg -framerate 20 -i recovered-out-video.h264 -i recovered-pure-adts.aac -c copy recovered_video.mp4
方法B(手工拼接“头+体”,替代 aacfixer):
cat recovered-headers.aac recovered-out-audio.raw > recovered-pure-adts.aac ffmpeg -framerate 20 -i recovered-out-video.h264 -i recovered-pure-adts.aac -c copy recovered_video.mp4
若暂时没有音频也要产出视频:
ffmpeg -framerate 20 -i recovered-out-video.h264 -c:v copy video_only.mp4
7)提升兼容性(yuv444p → yuv420p)
ffmpeg -i recovered_video.mp4 -pix_fmt yuv420p -c:a copy recovered_video_compatible.mp4
最终视频修复结果解析
修复完成:
关键日志片段如下(节选):
File: recovered-out-video.h264
Size: 236355313 ...
[h264] ... yuv444p, 2560x1600, 20 fps ...
...
./mp4fixer/aacfixer ... Segmentation fault (core dumped)
...
Output ... 'video_only.mp4' ... 未得到音频,已输出 video_only.mp4
完成:recovered_video.mp4
解读:
mp4fixer
成功导出了视频裸流recovered-out-video.h264
(约 225MB);- 像素格式 yuv444p,分辨率 2560×1600,约 20 fps;
aacfixer
段错误(这在某些环境/原始音轨损坏时常见),因此未成功恢复音频;- 脚本兜底输出了
video_only.mp4
(只有视频,但画面完整); - 日志中
SEI type 5 truncated
与Timestamps are unset
属可预期告警,因为我们是从裸流直接封装,时间戳与 SEI 信息并不完美,但不影响取回画面。 - 建议再做一次兼容性转换(yuv420p),用于浏览器或剪辑软件导入。
可以看见最后也是修复完成了,video_only.mp4就是最后修复出来的视频,但是音频没救回来,不过我是用视频来做GIF的所以也就无所谓。如果需要音频的话也是可以进一步修复的
当然,毕竟是修复的视频,我在看完视频后发现存在大量失真、画面丢失以及马赛克,但是还是完整的救回了一部分视频
常见故障与解决方案
现象 / 报错 | 原因 | 解决 |
---|---|---|
Invalid data found ... 、EBML header parsing failed |
.mux 非标准/缺索引 |
走本文 mp4fixer 流程,不直接用 ffmpeg 打开 .mux |
aacfixer 段错误 |
AAC 流或头部损坏 / 运行环境差异 | 用手工拼接(cat headers.aac + raw )法;或直接输出无音视频 |
Timestamps are unset ... |
裸流封装时无完整时间戳 | 一般可忽略;若需要精确 seeking,可先转码重建时间戳 |
画面能播、网页/软件导入失败 | 像素格式 yuv444p 兼容性差 |
转:-pix_fmt yuv420p |
音画不同步 | 原始时间戳缺失/错误 | 用 -itsoffset 微调:-itsoffset 0.5 等 |
参考视频不匹配导致失败 | 分辨率/帧率/编码参数不同 | 重新对齐设置,再录一次短参考视频 |
恢复后的兼容性与格式转换
多数浏览器/工程软件更偏好 yuv420p。
快速转换(不重编码音频):
ffmpeg -i recovered_video.mp4 -pix_fmt yuv420p -c:a copy recovered_video_compatible.mp4
若仅有视频(video_only.mp4
),同理:
ffmpeg -i video_only.mp4 -pix_fmt yuv420p -c:v copy video_only_420.mp4
进阶:万一音轨彻底救不回
检查是否真的录了音
ffprobe -v error -select_streams a -show_streams -of compact=p=0:nk=1 good_ref.mp4
参考视频若本就没有音轨,原始录屏可能也没录上。
二次尝试
ffmpeg -f aac -i recovered-out-audio.raw ...
(当作 ADTS 试读)ffmpeg -f latm -i recovered-out-audio.raw ...
(当作 LATM/LOAS 试读)
彻底无声时
先把画面用起来(video_only_420.mp4
),需要解说/讲解可后配音或用字幕替代。
预防与替代工具建议
容器选择:Kazam 中用 WebM/VP9(相对 MP4 对“未正常结束”的容错更好)。
更稳的录屏软件:
- SimpleScreenRecorder:轻量稳定(
sudo apt install simplescreenrecorder
) - OBS Studio:功能强大、行业通用(
sudo apt install obs-studio
)
- SimpleScreenRecorder:轻量稳定(
习惯:录前确认磁盘空间;录后务必等保存完成再关机/重启。
附录A:一键脚本全文
假设工作目录与坏文件名:
/media/yao/H/Research/RoboMaster2025-Dataset/kazam__qgjsngj.movie.mux
参考视频:good_ref.mp4
(同目录,5–10 秒,同设置录制)
--> cd /media/yao/H/Research/RoboMaster2025-Dataset
# 生成并运行一键脚本
--> cat > recover_kazam.sh <<'BASH'
输入下面这段指令:
注意路径更改为自己的实际路径!!!
---------------------------------------------------------
#!/usr/bin/env bash
set -euo pipefail
DIR="/media/yao/H/Research/RoboMaster2025-Dataset"
cd "$DIR"
MUX="kazam__qgjsngj.movie.mux"
REF="good_ref.mp4"
OUT="recovered"
FINAL="recovered_video.mp4"
# 基本检查
[ -f "$MUX" ] || { echo "找不到 $MUX"; exit 1; }
[ -f "$REF" ] || { echo "请先用 Kazam 录 5-10 秒并保存为 $REF"; exit 1; }
# 依赖
sudo apt update
sudo apt install -y perl ffmpeg git gcc libfaad-dev
# 备份
cp -n "$MUX" "$MUX.bak" || true
# 获取 mp4fixer
[ -d mp4fixer ] || git clone https://github.com/bookkojot/mp4fixer.git
# 提取参考视频 FPS(供 raw h264 封装时使用)
FPS=$(ffprobe -v 0 -select_streams v:0 -show_entries stream=r_frame_rate -of default=nw=1:nk=1 "$REF" \
| awk -F'/' '{ if ($2==""||$2==0) print 30; else printf "%.0f", $1/$2 }')
[ -z "$FPS" ] && FPS=20
echo "参考视频帧率: ${FPS} fps"
# 运行修复,导出裸流
perl mp4fixer/fixer.pl "$REF" "$MUX" "$OUT"
VID="$OUT-out-video.h264"
AAC="$OUT-out-audio.aac"
RAW="$OUT-out-audio.raw"
ADTS="$OUT-pure-adts.aac"
# 合成(优先直接用 aac;若是 raw 则先修 ADTS 头)
if [ -f "$AAC" ]; then
ffmpeg -y -framerate "$FPS" -i "$VID" -i "$AAC" -c copy "$FINAL"
elif [ -f "$RAW" ]; then
(cd mp4fixer && gcc aac.c -L. -lfaad -lm -o aacfixer)
./mp4fixer/aacfixer "$OUT-headers.aac" "$RAW" || true
if [ -f "$ADTS" ]; then
ffmpeg -y -framerate "$FPS" -i "$VID" -i "$ADTS" -c copy "$FINAL"
else
ffmpeg -y -framerate "$FPS" -i "$VID" -c:v copy "video_only.mp4"
echo "未得到音频,已输出 video_only.mp4"
fi
else
ffmpeg -y -framerate "$FPS" -i "$VID" -c:v copy "video_only.mp4"
fi
# 兼容性:如检测到 yuv444p,额外输出 yuv420p 版本
if [ -f "$FINAL" ]; then
if ffprobe -v 0 -select_streams v:0 -show_entries stream=pix_fmt -of csv=p=0 "$FINAL" | grep -q 'yuv444p'; then
echo "检测到 yuv444p,生成兼容版本(yuv420p)..."
ffmpeg -y -i "$FINAL" -pix_fmt yuv420p -c:a copy recovered_video_compatible.mp4
fi
fi
echo "完成:$FINAL(或 video_only.mp4)"
echo '若播放器/网页不兼容,可再执行:ffmpeg -i "'"$FINAL"'" -pix_fmt yuv420p -c:a copy recovered_video_compatible.mp4'
BASH
------------------------------------------------------------------
--> chmod +x recover_kazam.sh
--> ./recover_kazam.sh
附录B:命令速查表
# 备份
cp -n kazam__qgjsngj.movie.mux kazam__qgjsngj.movie.mux.bak
# 依赖
sudo apt update && sudo apt install -y perl ffmpeg git gcc libfaad-dev
# 获取 mp4fixer
git clone https://github.com/bookkojot/mp4fixer.git
# 运行修复
perl mp4fixer/fixer.pl good_ref.mp4 kazam__qgjsngj.movie.mux recovered
# 直接合成(有 ADTS AAC)
ffmpeg -framerate 20 -i recovered-out-video.h264 -i recovered-out-audio.aac -c copy recovered_video.mp4
# RAW → ADTS(工具失败时的拼接法)
cat recovered-headers.aac recovered-out-audio.raw > recovered-pure-adts.aac
ffmpeg -framerate 20 -i recovered-out-video.h264 -i recovered-pure-adts.aac -c copy recovered_video.mp4
# 仅视频
ffmpeg -framerate 20 -i recovered-out-video.h264 -c:v copy video_only.mp4
# 兼容性(yuv444p → yuv420p)
ffmpeg -i recovered_video.mp4 -pix_fmt yuv420p -c:a copy recovered_video_compatible.mp4
# 检查流信息
ffprobe -v error -show_streams -of compact=p=0:nk=1 recovered-out-audio.raw
附录C:FAQ
Q1:为什么必须要“参考视频”?
A:.mux
缺失可播放所需的头/索引。mp4fixer
通过一个相同设置的短 MP4 把“蓝图”迁回去,才能正确拆出裸流。
Q2:aacfixer
为什么会崩?
A:常见于音轨严重破坏或运行环境差异。可用“头+体拼接”替代:cat headers.aac + raw → pure-adts.aac
,再与视频合成。
Q3:封装后提示 Timestamps are unset
/ SEI truncated
正常吗?
A:正常。我们是把裸流直接装进容器,时间戳与 SEI 并不完美,但不影响“把画面救回来”。
Q4:网页/剪辑软件导不进?
A:多半因为 yuv444p。转为 yuv420p 即可。
Q5:如何避免再次踩坑?
A:录屏优先选 WebM/VP9 或改用 SimpleScreenRecorder/OBS;录前看磁盘,录后等保存完成再关机/重启。