SuperAPI AI 工具集

media3-custom-audio-processor

编程与开发

查看项目

更新于 10-17 16:15

技能介绍

用途

该技能用于指导开发者编写 Media3/ExoPlayer 音频管线中的自定义音频处理器,例如滤波器、淡入淡出(fade)、增益级(gain stage),并支持在运行时切换,同时可安全地在多个播放器实例间共享参数。

主要能力

  • 创建 BaseAudioProcessor 子类,并安装到 DefaultAudioSink 的处理器链中(通过 DefaultAudioProcessorChain 传入自定义处理器数组与内置处理器)。
  • 在 DefaultRenderersFactory 子类的 buildAudioSink 重写中构建处理器链,确保每个播放器实例创建独立的处理器实例。
  • 处理关键成员:onConfigure(协商音频格式)、isActive(是否在链中)、queueInput(执行实际处理)、onFlush/onReset(清理状态)。
  • 支持运行时切换:避免依赖 isActive 返回 false 来禁用处理器,而应在 queueInput 内部根据参数分支,保持处理器始终活动。
  • 正确处理输入缓冲区,确保完全消费,避免管线卡死;必要时添加排空循环。
  • 处理 ByteBuffer 别名问题,防止 put(ByteBuffer) 在源和目标相同时抛异常。
  • 每个播放器独立处理器实例,共享参数(如通过 () -> Float 传递淡入淡出因子),且每个缓冲区重新读取参数。
  • 在 onConfigure 中拒绝不支持的编码(返回 NOT_SET),并缓存采样率/声道数。
  • 区分 onFlush(每次 seek 或格式变化触发,仅清理历史)与 onReset(销毁时恢复默认值)。
  • 设置正确的字节序(inputBuffer.order(ByteOrder.nativeOrder()))再读取 short。

使用方式

  1. 继承 BaseAudioProcessor 实现自定义处理器。
  2. 在 DefaultRenderersFactory 子类的 buildAudioSink 中构建 DefaultAudioSink,并通过 setAudioProcessorChain 设置处理器链。
  3. 在 queueInput 中实现处理逻辑,始终消费整个输入缓冲区,并根据运行时参数分支。
  4. 通过参数(如函数引用)在多个播放器间共享配置,但每个播放器使用独立处理器实例。
  5. 在 onConfigure 中验证格式,返回支持的格式或 NOT_SET;缓存必要参数。
  6. 在 onFlush 中清理滤波器延迟线等历史状态,在 onReset 中恢复默认值。
  7. 验证:可反编译 BaseAudioProcessor 的 isActive 确认默认行为(比较 pendingOutputAudioFormat 与 NOT_SET),或手动在曲目中切换开关,确认效果立即生效而非仅下一曲生效。

适用场景

  • 需要为 Media3/ExoPlayer 添加自定义音频效果(如淡入淡出、增益、滤波)。
  • 需要在播放过程中动态启用/禁用音频处理。
  • 多个播放器实例(如交叉淡入淡出、预加载)需要共享同一参数但各自独立处理。

限制

  • 处理器实例不能跨播放器共享,因为每个处理器携带每流状态(格式、输出缓冲区)。
  • isActive 在链构建时询问,而非每个缓冲区;运行时切换不应依赖 isActive 返回 false。
  • queueInput 必须消费整个输入缓冲区,否则管线会反复提供同一缓冲区,导致静音且无错误。
  • 需要处理 ByteBuffer 别名风险。
  • 字节序必须正确设置,否则产生噪音。
  • 具体 API 版本差异(如 media3-common-1.11.0)可能影响反编译验证步骤,其他版本需自行调整。