Files
SpineWallpaper/docs/adr/0004-lossless-audio.md
Shuery 0ca78ed117 feat: 音频改回无损 FLAC(用户决定:壁纸在本地,不计体积)
撤销 issue 02 里的音频转码,把两条 FLAC 放回 dist。

- 恢复方式是**字节级还原**而非重新编码:masters/ 里两份文件的 git 对象哈希与基线
  `d8c7e49:dist/assets/audios/*.flac` 完全一致,即与已发布的 v2 是同一份文件。
  因此本次提交不新增任何 blob 存储——这两份内容早已在仓库历史里。
- `preset.js` 的音源指向改回 `.flac`。`pv37.mp3` 保持原样:它**没有无损源**,
  把有损数据转封装成 FLAC 只会涨体积,而一个 bit 的信息都不会回来。
- 体积基准由「≤35 MB」改为「不超过已发布的 v2(104.98 MB)」,实际 **96.94 MB**,
  比 v2 还小(图片部分的无损 WebP 收益仍在),不引入新的上传或订阅风险。

顺带修掉一个自己引入的 bug:改 `preset.js` 时漏写了文件名里的 `「」`,
浏览器请求 404 → `<audio>` 在 **64 ms** 内报 `MediaError.code = 4`(SRC_NOT_SUPPORTED),
看上去像"CEF 不支持 FLAC",实际是路径不存在。判定方法记进 ADR 0004:
把同一份字节交给 `decodeAudioData`,能解出正确时长就说明解码器没问题,问题在传输或路径。

验证:
- `test-props`:CEF 支持 audio/flac、无解码错误、readyState=4、时长 205.1 s,14 项音源断言全过。
- `test-acceptance` 新增第 ⑤ 节音频格式不变式:xilian 两个音源全为 flac、无 `.ogg`/`.opus`
  残留、`preset.js` 引用的每个音源文件都存在;三种比例 0 报错;预设往返不丢音频设置。
- 分带能量实测:FLAC 高频平滑延伸到 22 kHz(20–22 kHz 处 −50 dB),无有损断崖;
  与 Opus 版逐带相差 0.0–0.3 dB。即这是一个由偏好驱动、而非由测量差异驱动的决定。
2026-09-19 20:36:58 +08:00

39 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 音频用无损,不按体积取舍
`dist` 里的背景音乐用无损 FLAC(以及没有无损源时的原始 mp3),
**不以体积为由转成有损编码**。已发布的 v2 装的就是这份无损音频,本次改回是字节级还原。
## 背景
优化过程中一度把两条 FLAC(各约 37 MB)转成 Opus,`dist` 从 105.1 MB 降到 28.9 MB,
并把无损母带移到 `masters/`(gitignore,不入库)。用户随后明确要求:
「音频可使用无损格式,这个壁纸本身就在本地,无需考虑大小」。
## 决定
- 两条 FLAC 放回 `dist`,用 `masters/` 里的原件**直接复制**,不重新编码。
这一点可验证:`masters/` 里两份文件的 git 对象哈希与基线
`d8c7e49:dist/assets/audios/*.flac` 完全一致,即与已发布的 v2 是同一份字节。
- 体积基准从「≤35 MB」改为「**不超过已发布的 v2**(104.98 MB)」。实际 96.94 MB,
比 v2 还小,因此不引入新的上传或订阅风险。
- `pv37.mp3` 保持 mp3:**它没有无损源**。把有损数据转封装成 FLAC 只会让 2.3 MB 涨到十几 MB,
而一个 bit 的信息都不会回来——所以「没有无损源」时,正确做法是保持原样,而不是假装无损。
- 图片部分不撤:无损 WebP 本来就不牺牲画质,没有取舍可撤。
## 代价与前提
- 订阅者要多下载约 68 MB。用户已明确接受。
- 无损音频**只有在源头就是无损时才有意义**。这两条 FLAC 的高频能量一路平滑延伸到 22 kHz
(20–22 kHz 处 −50 dB、22–23.5 kHz 处 −62 dB),没有有损编码的断崖式截止,
分带能量与 Opus 版逐带相差 0.0–0.3 dB——即当初的 Opus 并没有砍掉高频,
差异只在量化噪声层面。
- 结论:这是一个**由用户偏好驱动、而非由测量差异驱动**的决定。记录下来是为了避免后续
有人(包括 agent)再以「体积可以更小」为由把它压回去。
## 附带教训
`MediaError.code = 4`(SRC_NOT_SUPPORTED)**要先查 404,再怀疑格式支持**。
文件名 `「再度和你」.flac` 带 `「」`,改 `preset.js` 时漏写这两个字符就会 404,
而浏览器给出的却是「格式不支持」,极具误导性。判定方法:同一份字节交给 `decodeAudioData`
若能解出正确时长,解码器就没问题,问题在传输或路径。