youxufkhan/carozerra

GitHub: youxufkhan/carozerra

解码旧款 Pioneer 汽车音响的 .lkd 动画文件,在浏览器或 Linux 桌面上重现蓝色 OEL 屏幕动画效果。

Stars: 2 | Forks: 1

Carozerra — decode forgotten Pioneer car-stereo .lkd animations and watch them glow again, live in a browser or as a Linux desktop visualizer.

Latest release Live demo License

The live web player: a Pioneer DEH-P7600MP faceplate with a decoded .lkd animation glowing cyan on its OEL screen

现已在 youxufkhan.github.io/carozerra 上线并可直接播放 — 点击图片即可,无需安装。

## 这是什么 旧款 Pioneer 主机(例如 DEH-P7600MP)允许您通过 CD 或 PC 链接上传自定义动画 到其蓝色的 OEL 显示屏上,这些动画以 `.lkd` 文件格式存储,没有现代 软件可以打开。Carozerra 对它们进行解码并重现了这一视觉效果 — 无论是在 网页端还是 Linux 桌面上,并且主机的自带控件都能执行真实的操作。 ## 格式的工作原理 `.lkd` 实际上只是**完全标准格式**的一层薄包装 — 没有专有的编解码器,整个处理流程中无需任何猜测: ``` offset bytes 0x00 "zLKD" magic (7A 4C 4B 44) 0x04 uint32 version = 3 0x08 uint32 (unknown) = 1 0x0C uint32 (unknown) = 7 0x10 uint32 frame count = 60 0x14 gzip stream ──▶ gunzip ──▶ TAR archive └─ one member = a 24-bit Windows BMP BMP = 256 × 3840, bottom-up, BGR = 60 stacked frames of 256 × 64 ``` 剥离 20 字节的 header → `gunzip` → `tar` → 读取 BMP → 将其切分为 60 帧 **256 × 64** 的图像。原生调色板是青蓝色 `rgb(7,158,175)` + 黑底白字 — 经典的蓝色 OEL 辉光 — 并且图像是经过抖动处理的(山脉、 瀑布、跳跃的海豚等)。 ## Web 播放器 完全在客户端进行解码 — 使用 `DecompressionStream` 处理 gzip,内联的 tar 读取器,以及解析 BMP 到 canvas。所有 8 个内置片段都已预加载,并且 可通过标签进行选择;拖放(或点击)仍然允许您加载任何其他 `.lkd` 文件 — 不会向任何地方上传数据。 在本地预览:`python3 -m http.server -d web 8000`,然后打开 `http://localhost:8000`。(需要先将 `assets/pioneer.png` 和 `assets/clips/*.lkd` 复制到 `web/pioneer.png` / `web/clips/` 中 — CI workflow 会在部署时 自动执行此操作;请参阅 `.github/workflows/pages.yml`。) ## 桌面应用 (Linux / Debian) 一个无边框、透明的、立体声形状的窗口:面板悬浮在您的 桌面上,动画在其 OEL 屏幕上播放,并且主机的自带 控件已连接到真实的操作。

The Linux desktop app: the same Pioneer faceplate floating as a transparent window, playing a dolphin animation

| 控件 | 操作 | |---|---| | **预设 1–6** | 切换动画(前六个片段) | | **左侧旋钮** | 拖动旋转 / 滚动滚轮 → **系统音量** | | **右侧导航旋钮** | 左/右 = 上一个/下一个片段 · 上/下 = 动画速度 | | **FUNC**(显示屏旁) | 切换复古辉光 | | **ESC**(右上角) | 退出 | | 拖动主体 / 边缘 | 移动 / 调整窗口大小(锁定纵横比) | 键盘:`←→` 片段,`↑↓` 速度,`F` 辉光,`1–6`,`Esc`。 **安装 `.deb`**(在 [Releases](../../releases) 中查看最新构建版本): ``` sudo apt install ./carozerra__all.deb carozerra ``` **或者从源码运行** — 依赖项是标准的 Debian/Ubuntu 软件包, 无需 pip install: ``` sudo apt install python3-pyqt6 python3-pil python3-numpy python3 carozerra.py ``` 系统音量使用 `wpctl` (PipeWire),并以 `pactl` 作为后备。所有 8 个 动画都从 `assets/` 预加载 — 桌面应用中不支持拖放或上传 (这是 Web 播放器独有的功能)。 几何属性(屏幕矩形区域、旋钮中心、按钮点击区域)位于 `carozerra.py` 顶部的 `G` 字典中, 作为面板的比例值,因此它会随着窗口缩放,并且很容易针对 不同的照片进行重新调整。 ## `decode.py` — 批量转换器 ``` python decode.py # assets/clips/*.lkd -> out/_clean.gif + _glow.gif python decode.py assets/clips/movie6.lkd --mp4 --frames # + MP4 + raw PNG frames python decode.py --glow --scale 6 --fps 12 # glow only, 6x, 12fps ``` 选项:`--outdir`(默认为 `out/`),`--scale`(默认为 4 → 1024×256), `--fps`(默认为 60 ms/frame),`--clean`,`--glow`,`--mp4`,`--frames`。 也可作为模块导入:`frames, meta = decode_lkd("assets/clips/movie1.lkd")` 会返回 60 帧 RGB `PIL.Image` 图像。 **clean** = 忠实的最近邻放大。**glow** = OEL 荧光粉视觉效果 (在黑色背景上的泛光 + 扫描线)。需要 Pillow(如果导出 MP4 则需要 PATH 中的 `ffmpeg`)。 输出位于 `out/` 目录中(已被 gitignored — 完全可重新生成,不随项目分发)。 ## 发布 ``` git tag v1.1.0 git push --tags ``` `release.yml` 会构建 `.deb` 并自动将其附加到新的 GitHub Release 中。 要在本地构建而不发布: ``` packaging/build-deb.sh 1.1.0 # packaging/dist/carozerra_1.1.0_all.deb ``` ## 许可证 [MIT](./LICENSE) — 涵盖代码部分(`decode.py`、`carozerra.py`、`web/`、 `packaging/`、`.github/`)。在 `assets/pioneer.png` 和 `reference/` 下的 Pioneer 产品照片并非本项目原创作品, 也不在许可证涵盖范围内 — 其 inclusion 仅为逆向工程文档 和 UI 设计目的。
仓库布局 ``` carozerra/ ├── web/ # GitHub Pages player — decodes .lkd fully client-side │ └── index.html ├── carozerra.py # Linux desktop visualizer (PyQt6) ├── decode.py # .lkd decoder — CLI + importable library ├── assets/ │ ├── pioneer.png # faceplate cutout, shared by web + desktop │ ├── clips/ # the 8 preloaded .lkd animations │ └── readme/ # this README's hero SVG + proof screenshots ├── reference/ # provenance only — not used by any code │ ├── pioneer-original.jpeg │ └── 1.gif ├── packaging/ │ ├── build-deb.sh # -> packaging/dist/carozerra__all.deb │ └── debian/ # control file template + .desktop entry └── .github/workflows/ ├── pages.yml # deploys web/ whenever web/** or assets/** change ├── packaging-check.yml # build-validates the .deb whenever app/packaging files change └── release.yml # builds + attaches the .deb to a GitHub Release on every v* tag ```
标签:Linux桌面应用, 云资产清单, 前端可视化, 多媒体工具, 数据可视化, 文件解析, 车载音响, 逆向工具, 逆向工程