TotalKommando/psp-media-toolkit

GitHub: TotalKommando/psp-media-toolkit

这是一套通过逆向工程实现的 PSP XMB 媒体工具包,可将视频和音频转换为符合真机规范的动态图标和声音文件,并提供纯 Python 的 EBOOT.PBP 重新打包功能。

Stars: 0 | Forks: 0

# psp-media-toolkit 将任何视频转换为可用于 PSP 自制 EBOOT 的**可用 `ICON1.PMF`**——即在 XMB 游戏菜单中播放的动态图标。通过逆向工程官方样本,与 Sony 自有的图标格式实现字节级匹配,并已在**真实 PSP 硬件上验证**。 它还可以创建**可用的 `SND0.AT3`** 图标声音(已通过硬件验证),并包含一个 PSMF/AT3 分析器以及一个纯 Python 编写的 EBOOT.PBP 重新打包工具,让你无需任何 SDK 即可嵌入两者。 ## 环境要求 - Python 3.8+(无需安装任何包——仅使用标准库) - [ffmpeg](https://ffmpeg.org/)(需要 `ffmpeg` + `ffprobe` 添加到 PATH 中),任何带有 libx264 的近期版本 - 仅用于 `SND0.AT3`:[atracdenc](https://github.com/dcherednik/atracdenc/releases) (`atracdenc-win-x86_0.2.1.zip`)——将 `atracdenc.exe` 放在 `pspmedia.py` 旁边 ## 快速开始 ``` # MP4(或任何 ffmpeg 可读取的文件) -> XMB 可用的动态图标 python pspmedia.py convert input.mp4 -o ICON1.PMF # WAV/MP3/任何格式 -> XMB 图标声音(需要 atracdenc.exe,参见 Requirements) python pspmedia.py snd0 input.wav -o SND0.AT3 # 检查任何 PMF 或 AT3 并根据已知的 XMB 限制进行比对 python pspmedia.py analyze ICON1.PMF python pspmedia.py analyze some_game_icon1.pmf # 嵌入到现有的 homebrew EBOOT.PBP 中(无需 SDK) python pspmedia.py pbp MyApp/EBOOT.PBP -o EBOOT.PBP \ --icon1 ICON1.PMF --snd0 SND0.AT3 --title "MY APP" ``` `convert` 负责一切:将画面缩放/填充至 144×80,将帧率转换为 29.97 fps,进行受限的 H.264 双次编码,执行 PSMF 封装,以及完整的自检流程(结构差异对比、索引表验证、往返解码)。如果结果超出 XMB 的大小预算,它会自动降低比特率重新编码。 选项: | 标志 | 默认值 | 含义 | |---|---|---| | `--budget-kb` | 450 | 目标文件大小预算(XMB 限制约为 500 KB,如果存在 SND0.AT3 则共享此空间) | | `-o` | `ICON1.PMF` | 输出路径 | ## 为什么 PMF 转换会出现故障 XMB 图标播放器**不是**一个通用的 PMF 播放器。它拥有一个专为 Sony 图标编码规范设定的小型固定环形缓冲区。那些以电影级设置(高比特率、大 VBV 缓冲区)生成结构上合规的 PSMF 的转换工具,在播放时会出现画面错乱/故障或黑屏。一个可用的图标必须符合以下规范: | 参数 | 要求值 | |---|---| | 分辨率 | 144×80 | | 编解码器 | H.264 **Main@2.1**,CABAC,1 个参考帧,无 B 帧 | | 帧率 | 29.97 (30000/1001) | | HRD (VBV) | **600 kbps 速率,600 kbit 缓冲区** | | 声明的 P-STD 缓冲区 | **80 KB**(在封装中出现 3 次) | | 色彩 | 设置全范围标志,无色彩描述 | | 文件大小 | < ~500 KB(与 SND0.AT3 共享预算) | 该工具中的封装器重现了 Sony 精确的容器布局:2048 字节的包、每个 GOP 的 `0xBF` 帧索引包、稀疏的 PTS 标记、填充行为、header TLV 等全部细节。有关完整的逆向工程格式文档,请参阅 [FINDINGS.md](FINDINGS.md)。 ## PBP 重新打包工具 ``` python pspmedia.py pbp -o EBOOT.PBP \ --icon1 ICON1.PMF [--snd0 SND0.AT3] [--title "NEW TITLE"] ``` 接收任何现有的自制 EBOOT.PBP,替换为新的媒体条目并可选择修改 `PARAM.SFO` 标题,然后写入一个新的 PBP。纯 Python 实现,无需 SDK。只要高亮选中条目,XMB 就会播放 ICON1/SND0——可执行文件完全不受影响。 ## 音频 (SND0.AT3) —— 可用,完全开源 **AT3 显然已经被 @GrayJack 搞定了** ``` python pspmedia.py snd0 input.wav -o SND0.AT3 ``` 经过硬件验证的流程:重采样至 44.1 kHz 立体声 → 使用 atracdenc 编码为普通的 **ATRAC3 LP4 (66 kbps)** → 重封装为 RIFF `.at3` → 注入 `fact` + `smpl` 循环数据块。音频大小约为每秒 8 KB。 在硬件上发现的成败关键细节:**`fact` 数据块中声明的内容绝不能超过帧实际能解码的样本数** (`samples + delay + 368 ≤ frames × samples_per_frame`)。所有已知的零售版正常文件都遵循此规则;任何超额声明样本数的文件——即使只多了几百个——在 XMB 上都会播放*不出任何声音*。该工具会自动对其进行限制。 注意: - 零售版游戏使用的是 **48–128 kbps 的 ATRAC3+**。如果你想要那种精确的规格,只需将 Sony 的 `at3tool.exe` 放置在脚本旁——该工具会自动优先使用它(`--codec at3p`)。这不是让声音正常工作的必需条件。 - atracdenc 的 ATRAC3+ 模式被硬编码为 352.8 kbps,即使带有有效的包装器,PSP 也会拒绝接受——因此默认使用普通的 ATRAC3。 - ICON1.PMF + SND0.AT3 共享约 500 KB 的预算;一对 5 秒的图标文件总共约占 400 KB。 ## 子命令参考 ``` analyze dissect + validate against XMB limits convert
标签:PSP, Python, 云资产清单, 多媒体工具, 无后门, 视频转码, 逆向工具, 逆向工程