如何将 "Equalizer" 与 "audio_service" 包一起使用
How to use "Equalizer" with "audio_service" package
我正在使用 just_audio
和 audio_serivce
软件包。其他一切正常,现在我想实现一个 Equalizer
。我在 just_audio
中看到了关于添加均衡器的 example。但我不太确定如何使用 audio_service
来实现它。
我已经在后台服务中像这样初始化了音频播放器:
_player = AudioPlayer(
handleInterruptions: true,
androidApplyAudioAttributes: true,
handleAudioSessionActivation: true,
audioPipeline: AudioPipeline(
androidAudioEffects: [
_equalizer,
],
),
);
并使用 example 中的代码进行 flutter UI。但是如何在UI部分使用Background service的_equalizer
呢?我尝试使用 customAction
访问它但没有成功。
虽然控制均衡器不是智能手表和汽车所理解的标准媒体控件之一,但您仍然可以将其添加为自定义操作:一个用于设置频段的增益,另一个用于读取当前频段和均衡器支持的 min/max 分贝。您可以在 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(设置增益值并阅读 min/max分贝):
// in UI
final eqParams = await audioHandler.customAction('getEqParams');
// Now use eqParams as desired.
当然,这会破坏封装(但这就是为什么我称之为快速而肮脏的方法。)
我正在使用 just_audio
和 audio_serivce
软件包。其他一切正常,现在我想实现一个 Equalizer
。我在 just_audio
中看到了关于添加均衡器的 example。但我不太确定如何使用 audio_service
来实现它。
我已经在后台服务中像这样初始化了音频播放器:
_player = AudioPlayer(
handleInterruptions: true,
androidApplyAudioAttributes: true,
handleAudioSessionActivation: true,
audioPipeline: AudioPipeline(
androidAudioEffects: [
_equalizer,
],
),
);
并使用 example 中的代码进行 flutter UI。但是如何在UI部分使用Background service的_equalizer
呢?我尝试使用 customAction
访问它但没有成功。
虽然控制均衡器不是智能手表和汽车所理解的标准媒体控件之一,但您仍然可以将其添加为自定义操作:一个用于设置频段的增益,另一个用于读取当前频段和均衡器支持的 min/max 分贝。您可以在 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(设置增益值并阅读 min/max分贝):
// in UI
final eqParams = await audioHandler.customAction('getEqParams');
// Now use eqParams as desired.
当然,这会破坏封装(但这就是为什么我称之为快速而肮脏的方法。)