如何将"Equalizer"与"audio_service"包一起使用



我正在使用just_audioaudio_serivce包。其他一切都很好,现在我想实现一个Equalizer。我在just_audio中看到了关于添加均衡器的示例。但我真的不知道如何用audio_service实现它。我已经在后台服务中初始化了音频播放器,如下所示:

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

并将该代码作为示例用于flutter UI。但是如何在UI部分使用后台服务的_equalizer呢?我尝试使用customAction访问它,但没有成功。

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

例如,通过自定义操作,您可以在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.

当然,这打破了封装(但这就是为什么我称之为快速而肮脏的方法。(

相关内容

  • 没有找到相关文章