- ①画面早了半秒以上
RhythmAnalyzer通过TeeAudioProcessor取样,取的是还没写进 AudioTrack 的 PCM。Media3 1.11.1 的DefaultAudioTrackBufferSizeProvider把 PCM 缓冲定死在 500ms(targetPcmBufferDurationUs = 500000,已从依赖的 aar 里核对过),正常播放时这块缓冲一直是满的,再加上设备输出延迟,分析出的结果比耳朵听到的早 0.5–0.8 秒。上一版方案页里的原型分析的是“正在听到”的那一段,所以原型里对得上,App 里对不上。 - ②早多少不固定,偶尔还会恰好对上一拍的长度是 60/BPM 秒。提前量正好接近一拍时(比如 104 BPM 配手机扬声器),看起来只差几十毫秒;换一首速度不同的歌,或者戴上蓝牙耳机,脉冲就落到两拍中间了。ITU-R BT.1359 给的可察觉门限是:声音比画面早 45ms,或比画面晚 125ms。下表算的是画面上的一次反应离最近的拍点有多远,正数表示比拍点晚:
- ③每一拍的变化太小上一轮为了不让整屏闪,几处跟拍的量都压低了。现在能随单拍变化的只剩下表里这些,上面还压着一层 12%–84% 的固定遮罩:
| 元素 | 跟着什么 | 一拍里能看到的变化(标准档) |
|---|---|---|
| 光团半径 | 低频慢包络 swell(0.3 秒起、1 秒落) | 不随单拍变;鼓点额外胀 5% |
| 光团光量 | 逐帧低频 ×0.03,鼓点 ×0.02 | 在 0.16–0.36 的底上多 0.02–0.05 |
| 鼓点光环 | 鼓点 | 峰值不透明度 0.06,0.12 秒淡入、0.9 秒散完 |
| 封面层、光晕 | swell ×0.05 | 不随单拍变 |
| 进度条波幅 | 0.3 + swell,指示器自带 500ms 补间 | 不随单拍变(补间进行中不接新值) |
- ④鼓点检测本身没有规律检测只看 0–690Hz 的谱通量,贝斯音符也会触发;不应期是 280ms。遇到“底鼓在正拍、贝斯在反拍”的电子乐,常常会锁到反拍上:仿真用的 128 BPM 电子曲里,56 次检测有 33 次落在反拍。另外检测没有“拍子”的概念,漏一下、多一下都会直接出现在画面上,人眼看不出规律。