android - 如何将“均衡器”与“audio_service”包一起使用
问题描述
我正在使用just_audio
包装audio_serivce
。其他一切正常,现在我想实现一个Equalizer
. 我看到了关于添加均衡器的例子。just_audio
但我不太确定如何使用audio_service
. 我在后台服务中初始化了这样的音频播放器:
_player = AudioPlayer(
handleInterruptions: true,
androidApplyAudioAttributes: true,
handleAudioSessionActivation: true,
audioPipeline: AudioPipeline(
androidAudioEffects: [
_equalizer,
],
),
);
并将示例中的代码用于颤振 UI。但是如何_equalizer
在 UI 部分使用后台服务呢?我尝试使用它访问它,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.
当然,这会破坏封装(但这就是我称之为快速而肮脏的方法的原因。)
推荐阅读
- java - 然后输入数字继续读取 int。值,直到这些整数的总和等于或大于开始时输入的值
- reactjs - Axios 获取请求获取 cors 问题
- reactjs - 需要反应选择下拉菜单
- mysql - 将本地 MySQL 数据库数据同步到实时 MySQL 数据库
- python - 如何调用另一个函数的结果
- flutter - 用于 ListView 的 Flutter 自定义小部件
- angular - 如何在垫表内进行两种方式绑定垫日期选择器
- sql-server - 内部联接返回错误数量的结果
- aws-lambda - 将代码版本插入 CloudFormation 模板中的 Handler 属性时,Lambda 找不到文件
- javascript - 如何下载 Angular 7?