如何将“均衡器”与“audio_service”包一起使用

Posted

技术标签:

【中文标题】如何将“均衡器”与“audio_service”包一起使用【英文标题】:How to use "Equalizer" with "audio_service" package 【发布时间】:2021-09-25 04:43:34 【问题描述】:

我正在使用 just_audioaudio_serivce 包。其他一切正常,现在我想实现一个Equalizer。我在just_audio 中看到了关于添加均衡器的example。但我不确定如何使用audio_service 来实现它。 我在后台服务中初始化了这样的音频播放器:

_player = AudioPlayer(
  handleInterruptions: true,
  androidApplyAudioAttributes: true,
  handleAudiosessionActivation: true,
  audioPipeline: AudioPipeline(
    androidAudioEffects: [
      _equalizer,
    ],
  ),
);

并使用example 中的代码来实现 Flutter UI。但是如何在UI部分使用后台服务的_equalizer呢?我尝试使用customAction 访问它,但没有成功。

【问题讨论】:

【参考方案1】:

虽然控制均衡器不是智能手表和汽车所理解的标准媒体控件之一,但您仍然可以将其添加为自定义操作:一个用于设置频段的增益,另一个用于读取当前频段和最小/ 均衡器支持的最大分贝。您可以在 FAQ

中阅读有关自定义操作的信息

例如,通过自定义操作,您可以在 UI 中为波段设置增益,如下所示:

// audio_service 0.17.x
AudioService.customAction('setBandGain', 'band': 0, 'gain': gain);
// audio_service 0.18.x
audioHandler.customAction('setBandGain', 'band': 0, 'gain': gain);

在您的后台音频任务 (0.17.x) 或音频处理程序 (0.18.x) 中,您可以像这样定义回调处理程序:

// 0.17.x
Future<dynamic> onCustomAction(String name, dynamic arguments) async 
  if (name == 'setBandGain') 
     final bandIdx = arguments['band'] as int;
     final gain = arguments['gain'] as double;
    await _eqParams.bands[bandIdx].setGain(gain);
  

// 0.18.x
Future<dynamic> customAction(String name, [Map<String, dynamic>? extras]) async 
  if (name == 'setBandGain') 
     final bandIdx = extras!['band'] as int;
     final gain = extras!['gain'] as double;
    await _eqParams.bands[bandIdx].setGain(gain);
  

或者,如果您想要一种快速而肮脏的方法,那么在 0.18.0 中也可以使用以下方法,因为它在同一个隔离中运行所有内容,并且整个均衡器参数对象可以通过引用传递:

Future<dynamic> customAction(String name, [Map<String, dynamic>? extras]) async 
  if (name == 'getEqParams') 
    return await _equalizer.parameters;
  

现在您可以从您的 UI 中直接获取均衡器参数,然后通过该对象引用您可以访问其完整的 API(设置增益值并读取最小/最大分贝):

// in UI
final eqParams = await audioHandler.customAction('getEqParams');
// Now use eqParams as desired.

当然,这会破坏封装(但这就是我称之为快速而肮脏的方法的原因。)

【讨论】:

好的,我明白了,但是如何在 UI 中获取参数、波段和所有内容?我尝试在 UI 中创建 AudioEqualizer 的实例,但它没有给我任何参数。 是否还需要从后台服务的均衡器实例中获取参数?我不能在 UI 中创建另一个实例吗? 除非您使用传入播放器音频管道的同一实例,否则它将无法工作。否则,该均衡器音频效果将不会以任何方式附加到播放器。 我已经在后台服务中初始化了实例,然后返回 Future。但是未来永远不会在后台服务和 UI 中返回任何值 未来应该在加载音频源后完成。如果不是,则可能是您需要报告的错误。

以上是关于如何将“均衡器”与“audio_service”包一起使用的主要内容,如果未能解决你的问题,请参考以下文章

在 Audio_Service Flutter 中启用或禁用锁屏艺术

Flutter audio_service 设置评分

如何将 Spring Security 与负载均衡器一起使用?

如何使用插件audio_service颤动处理音频通知的onTap?

歌曲添加到队列未播放(使用 just_audio 和 audio_service)

将 S3 静态站点与应用程序负载均衡器结合使用