在Android、AudioEffect API中,所有内置的效果(如均衡器)都有一个警告。
注意:不推荐使用会话0将均衡器附加到全局音频输出组合。
如果这是不推荐的,那么替代API是什么?我的目标是对全球产出组合产生影响.
发布于 2013-04-05 10:55:47
是的,因为副作用异构体,它是不受欢迎的。
Android开发人员网站声明,均衡器类的第二个参数应该是:
系统范围唯一的音频会话标识符。均衡器将在同一个音频会话中附加到MediaPlayer或AudioTrack。
你应该用这个代替:
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource( _your_data_source_ );
Equalizer equalizer = new Equalizer(0, mediaPlayer.getAudioSessionId());
equalizer.setEnabled(true);
/* Do your stuff ... */
mediaPlayer.start();发布于 2019-11-24 22:57:09
除了将AudioEffect附加到全局输出之外,别无选择。您应该做的是注册一个接收所有音频会话的广播接收器,这样您就可以应用音频效果。一个例子可以找到这里。包含会话ID的意图在此BroadcastReceiver中获得。请记住,只有当您在清单中注册接收方时,此操作才有效。或者,您可以像这样在服务onCreate()中以编程方式注册接收器:
IntentFilter()
.apply { addAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) }
.apply { addAction(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) }
.run { registerReceiver(mAudioSessionReceiver, this) } `其中mAudioSessionReceiver看起来如下所示:
private val mAudioSessionReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent == null || context == null) {
return
}
val sessionStates = arrayOf(
AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION,
AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION
)
if (sessionStates.contains(intent.action)) {
val service = Intent(context, WaveletService::class.java)
val sessionID = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, AudioEffect.ERROR)
service
.apply { action = intent.action }
.apply { putExtra(AudioEffect.EXTRA_AUDIO_SESSION, sessionID) }
context.startService(service)
}
}
}`然后,您可以在onStartCommand中获得意图:
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent == null)
return START_STICKY
val sessionID = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, AudioEffect.ERROR)
when (intent.action) {
AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION -> {
// create new instance of the AudioEffect using the sessionID
}
AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION -> {
// Release instance of the AudioEffect connected to this sessionID
}
}
return START_REDELIVER_INTENT
}`最后,不要忘记在onDestroy()中注销接收方:
unregisterReceiver(mAudioSessionReceiver)`发布于 2019-10-03 21:16:16
根据安卓,您可以使用ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION接收播放音频会话的id:
意图向效果控制应用程序或服务发送信号,表示打开了新的音频会话,并要求应用音频效果。
我尝试在清单中添加常量,但它没有起作用:
<receiver android:name=".receivers.AudioSessionReceiver">
<intent-filter>
<action android:name="android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION"/>
</intent-filter>
</receiver>如果您知道如何使用常量,意图将包含音频会话id,您可以使用它来应用您想要的均衡器设置。(如果你在这些年里找到了一个解决方案,你会介意分享吗?)
https://stackoverflow.com/questions/9404776
复制相似问题