Kazam产生.movie.mux后恢复视频为.mp4

从 炸掉的 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)备份原件

bash 复制代码
cd /media/yao/H/Research/RoboMaster2025-Dataset
cp -n kazam__qgjsngj.movie.mux kazam__qgjsngj.movie.mux.bak

2)安装依赖

bash 复制代码
sudo apt update
sudo apt install -y perl ffmpeg git gcc libfaad-dev

3)准备参考视频 good_ref.mp4

与出问题时参数一致(分辨率/帧率/音频),录 5--10 秒,正常保存到当前目录。

4)获取 mp4fixer

bash 复制代码
git clone https://github.com/bookkojot/mp4fixer.git

5)运行修复,导出裸流

bash 复制代码
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):

    bash 复制代码
    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,见下节):

    bash 复制代码
    (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):

    bash 复制代码
    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
  • 若暂时没有音频也要产出视频:

    bash 复制代码
    ffmpeg -framerate 20 -i recovered-out-video.h264 -c:v copy video_only.mp4

7)提升兼容性(yuv444p → yuv420p)

bash 复制代码
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 truncatedTimestamps 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

快速转换(不重编码音频):

bash 复制代码
ffmpeg -i recovered_video.mp4 -pix_fmt yuv420p -c:a copy recovered_video_compatible.mp4

若仅有视频(video_only.mp4),同理:

bash 复制代码
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
  • 习惯 :录前确认磁盘空间;录后务必等保存完成再关机/重启。


附录A:一键脚本全文

假设工作目录与坏文件名:
/media/yao/H/Research/RoboMaster2025-Dataset/kazam__qgjsngj.movie.mux

参考视频:good_ref.mp4(同目录,5--10 秒,同设置录制

bash 复制代码
--> 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:命令速查表

bash 复制代码
# 备份
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;录前看磁盘,录后等保存完成再关机/重启。

相关推荐
Sadsvit1 分钟前
Linux 服务器性能监控、分析与优化全指南
java·linux·服务器
农夫山泉(代码版)14 分钟前
Linux驱动学习(七)平台总线框架
linux·服务器·学习
通信小小昕16 分钟前
Petalinux快捷下载
linux
Neng_Miao24 分钟前
用户与组管理命令
linux·运维
huxiao_060134 分钟前
如何手动打包 Linux(麒麟系统)的 Qt 程序
linux·qt
namehu2 小时前
阿里云 acme.sh install timeout(超时)问题解析与解决方案
linux·前端·https
南极浮冰3 小时前
【无标题】
linux·人工智能·python
小孙姐3 小时前
Linux-Day02.Linux指令
linux·运维·服务器
搞不懂语言的程序员3 小时前
Linux Epool的作用
linux·服务器