首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将AudioEffect附加到全球组合中的首选方法?

将AudioEffect附加到全球组合中的首选方法?
EN

Stack Overflow用户
提问于 2012-02-22 23:16:44
回答 3查看 4.5K关注 0票数 15

在Android、AudioEffect API中,所有内置的效果(如均衡器)都有一个警告。

注意:不推荐使用会话0将均衡器附加到全局音频输出组合。

如果这是不推荐的,那么替代API是什么?我的目标是对全球产出组合产生影响.

EN

回答 3

Stack Overflow用户

发布于 2013-04-05 10:55:47

是的,因为副作用异构体,它是不受欢迎的。

Android开发人员网站声明,均衡器类的第二个参数应该是:

系统范围唯一的音频会话标识符。均衡器将在同一个音频会话中附加到MediaPlayer或AudioTrack。

你应该用这个代替:

代码语言:javascript
复制
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource( _your_data_source_ );
Equalizer equalizer = new Equalizer(0, mediaPlayer.getAudioSessionId());
equalizer.setEnabled(true);
/* Do your stuff ... */
mediaPlayer.start();
票数 6
EN

Stack Overflow用户

发布于 2019-11-24 22:57:09

除了将AudioEffect附加到全局输出之外,别无选择。您应该做的是注册一个接收所有音频会话的广播接收器,这样您就可以应用音频效果。一个例子可以找到这里。包含会话ID的意图在此BroadcastReceiver中获得。请记住,只有当您在清单中注册接收方时,此操作才有效。或者,您可以像这样在服务onCreate()中以编程方式注册接收器:

代码语言:javascript
复制
IntentFilter()
    .apply { addAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) }
    .apply { addAction(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) }
    .run { registerReceiver(mAudioSessionReceiver, this) } `

其中mAudioSessionReceiver看起来如下所示:

代码语言:javascript
复制
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中获得意图:

代码语言:javascript
复制
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()中注销接收方:

代码语言:javascript
复制
unregisterReceiver(mAudioSessionReceiver)`
票数 5
EN

Stack Overflow用户

发布于 2019-10-03 21:16:16

根据安卓,您可以使用ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION接收播放音频会话的id:

意图向效果控制应用程序或服务发送信号,表示打开了新的音频会话,并要求应用音频效果。

我尝试在清单中添加常量,但它没有起作用:

代码语言:javascript
复制
<receiver android:name=".receivers.AudioSessionReceiver">
        <intent-filter>
            <action android:name="android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION"/>
        </intent-filter>
</receiver>

如果您知道如何使用常量,意图将包含音频会话id,您可以使用它来应用您想要的均衡器设置。(如果你在这些年里找到了一个解决方案,你会介意分享吗?)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9404776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档