当前位置: 首页 > news >正文

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

从 炸掉的 Kazam .movie.mux 里把视频救回来

适用:Kazam 录屏未正常结束后,仅留下一个巨大的 *.movie.mux 与一个 0B 或可播放的 MP4。
环境:Ubuntu 20.04(其它 Linux 亦可参考),Kazam,FFmpeg,Perl。
成果:成功恢复完整视频画面(如有音频且未完全损坏,也尽力修复并合成)。
文末附:一键脚本、常见报错逐条解决、预防建议(更稳定的录屏方案)。


目录

  • 背景与问题现象

  • 原理简述:.movie.mux 是什么

  • 两条恢复路线

    • 快速版:一键脚本(推荐)
    • 教科书版:逐步手工操作
  • 你的实战日志解析与复盘

  • 常见故障与解决方案

  • 恢复后的兼容性与格式转换

  • 进阶:万一音轨彻底救不回

  • 预防与替代工具建议

  • 附录A:一键脚本全文

  • 附录B:命令速查表

  • 附录C:FAQ


背景与问题现象

一次长时间录屏后,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 头解析失败等。

figure

这是一开始完成录制后产生的三个文件,当然你也可能没有这个.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。

注意脚本中的文件路径一定要修改为自己的实际路径

脚本运行时是这样,时间比较久,特别是你的视频本身比较大的时候,耐心等待

视频短的话会快很多

figure


教科书版:逐步手工操作

假定工作目录:/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

最终视频修复结果解析

修复完成:
figure

关键日志片段如下(节选):

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),用于浏览器或剪辑软件导入。

figure

可以看见最后也是修复完成了,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
  • 习惯:录前确认磁盘空间;录后务必等保存完成再关机/重启。


附录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" ]; thenffmpeg -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" || trueif [ -f "$ADTS" ]; thenffmpeg -y -framerate "$FPS" -i "$VID" -i "$ADTS" -c copy "$FINAL"elseffmpeg -y -framerate "$FPS" -i "$VID" -c:v copy "video_only.mp4"echo "未得到音频,已输出 video_only.mp4"fi
elseffmpeg -y -framerate "$FPS" -i "$VID" -c:v copy "video_only.mp4"
fi# 兼容性:如检测到 yuv444p,额外输出 yuv420p 版本
if [ -f "$FINAL" ]; thenif ffprobe -v 0 -select_streams v:0 -show_entries stream=pix_fmt -of csv=p=0 "$FINAL" | grep -q 'yuv444p'; thenecho "检测到 yuv444p,生成兼容版本(yuv420p)..."ffmpeg -y -i "$FINAL" -pix_fmt yuv420p -c:a copy recovered_video_compatible.mp4fi
fiecho "完成:$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;录前看磁盘,录后等保存完成再关机/重启。

http://www.dtcms.com/a/312803.html

相关文章:

  • 小宿科技:AI Agent 的卖铲人
  • zookeeper持久化和恢复原理
  • idea中.xml文件的块注释快捷键
  • Hugging Face 模型文件介绍
  • IDEA查看源码利器XCodeMap插件
  • 【高等数学】第七章 微分方程——第八节 常系数非齐次线性微分方程
  • 【lucene】ByteBuffersIndexInput
  • k8s日志收集
  • Redis面试精讲 Day 8:Stream消息队列设计与实现
  • 对接古老系统的架构实践:封装混乱,走向有序
  • [硬件电路-146]:模拟电路 - DCDC与LDO详解、常见芯片、管脚定义
  • 基于 LangChain + 通义千问 + bge-large 中文 Embedding 搭建一个RAG问答示例
  • TVS二极管数据手册解读
  • 【lucene】ByteBufferGuard
  • Android 之 MVVM架构
  • 【MySQL】MySQL中锁有哪些?
  • Flutter 函数的基本使用
  • day39 力扣198.打家劫舍 力扣213.打家劫舍II 力扣337.打家劫舍 III
  • 常见框架漏洞靶场攻略
  • Java 实现poi方式读取word文件内容
  • 力扣967:连续差相同的数字
  • Mysql1
  • Docker-03.快速入门-部署MySQL
  • python的蛋糕店管理系统
  • MySQL的创建管理表:
  • 求根到叶子节点数字之和
  • 【数据分享】南京诗歌文学地理数据集(获取方式看文末)
  • 电机结构设计与特性曲线分析:基于MATLAB和FEMM的仿真研究
  • 6. 平台总线
  • 机器学习第四课之决策树