proposal.md 2.5 KB

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 内置能力