youxufkhan/carozerra
GitHub: youxufkhan/carozerra
解码旧款 Pioneer 汽车音响的 .lkd 动画文件,在浏览器或 Linux 桌面上重现蓝色 OEL 屏幕动画效果。
Stars: 2 | Forks: 1
现已在 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 屏幕上播放,并且主机的自带
控件已连接到真实的操作。
| 控件 | 操作 |
|---|---|
| **预设 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桌面应用, 云资产清单, 前端可视化, 多媒体工具, 数据可视化, 文件解析, 车载音响, 逆向工具, 逆向工程