Why
当前播放界面仅有旋转唱片和歌词两个视图,缺乏对音频本身节奏韵律的可视化表达。添加基于 FFT(快速傅立叶变换)的实时频谱动画,可以让用户直观感受音频的频率分布和节奏变化,同时为播放界面增加丰富的视觉吸引力。多种可切换的频谱特效(柱状图、波形、粒子等)能满足不同用户的审美偏好。
What Changes
- 在 ijkplayer 原生层(C/NAPI)拦截
AudioRendererOnWriteData 回调中的 PCM 数据,通过环形缓冲区暴露给 ArkTS 层
- 新增 NAPI 接口,ArkTS 侧可按需获取当前 PCM 帧数据
- 在 ArkTS 侧实现 FFT 算法,将时域 PCM 数据转换为频域频谱数据
- 新增频谱可视化组件,使用 Canvas 绘制多种实时频谱动画特效:
- 柱状频谱:经典的频率柱状条跳动
- 波形频谱:平滑曲线展示频率变化
- 圆形频谱:环形排列的频谱条,围绕封面旋转
- 粒子频谱:根据频率驱动粒子的颜色、大小和运动轨迹
- 所有特效的颜色、亮度、大小、动画速度均由实时频谱数据驱动
- 在播放界面 Swiper 中新增频谱页面,用户可左右滑动切换(封面 / 频谱 / 歌词)
- 新增频谱特效切换 UI,支持在多种特效间切换
- 频谱动画仅在播放状态下运行,暂停/停止时冻结或隐藏
Capabilities
New Capabilities
audio-pcm-bridge: 从 ijkplayer 原生音频管线中提取实时 PCM 数据,通过 NAPI 环形缓冲区桥接到 ArkTS 层
fft-analyzer: ArkTS 侧的 FFT 频谱分析模块,将 PCM 时域数据转换为频域频谱数据,提供平滑、分频段等处理
spectrum-visualizer: 基于 Canvas 的多特效频谱可视化组件,支持柱状、波形、圆形、粒子等多种动画模式,所有动效参数由频谱数据实时驱动
Modified Capabilities
(无已有 spec 需要修改)
Impact
- ijkplayer 原生层:修改
ijksdl_aout_android_opensles.c 中的 AudioRendererOnWriteData,在均衡器处理后拷贝 PCM 数据到环形缓冲区;新增 NAPI 导出函数
- entry 模块:新增 FFT 分析工具类、频谱可视化视图组件;修改
LocalMusic.ets 的 Swiper 容器以接入新的频谱页面
- 性能影响:FFT 计算和 Canvas 绑帧渲染会增加 CPU/GPU 开销,需要控制采样率和绘制频率(目标 30-60fps)
- 依赖:无新外部依赖,FFT 算法自行实现(Cooley-Tukey 基2算法),Canvas 为 ArkUI 内置能力