繁体   English   中英

AudioManager 在 setMode(MODE_IN_COMMUNICATION) 中引入延迟

[英]AudioManager is introducing delay in the setMode(MODE_IN_COMMUNICATION)

即使耳机打开,我也试图在扬声器上播放声音,但如果背景中有音乐播放,我希望在播放声音之前在耳机上播放音乐。

所以我正在采取以下步骤:

  • 在我播放声音之前,我获得了 audioFocus 所以所有的背景音乐都停止了
  • 获得audioFocus后,我将MODE_COMMUNICATION设置为AudioManager,这样声音就可以在扬声器上播放了。
  • 声音结束后,我abandonAudioFocus并设置回MODE_NORMALAudioManager ,所以背景音乐仍然可以在耳机播放。

奇怪的是它取决于设备,在某些设备上这是可以的,但是在设置MODE_COMMUNICATION后在 Nexus 6P(华为)设备上有延迟 3-4 秒才能播放声音。 如果我没有延迟地播放声音,那么它既不会播放到扬声器也不会播放到耳机。

问题

我怎么知道在播放声音之前要设置多少延迟? 有没有我可以附加的侦听器,所以可以通知我在设置MODE_COMMUNICATION后声音可以播放了吗?

即使没有必要,我也不想设置延迟!

解决方案不是在类的构造函数中设置模式(跳过延迟),因为我需要在特定时刻在扬声器上播放声音!

PS:我正在使用AudioTrack播放声音,但我也尝试使用MediaPlayer (设置setAudioStreamType(MODE_IN_COMMUNICATION) ),但没有成功,延迟仍然存在!

那么有什么建议吗?

万一有人偶然发现这篇文章,对我AudioManager.setMode()是调用AudioManager.setMode()然后重新创建我的MediaPlayer (通过构造函数,而不是create() )并使用setAudioAttributes()来更改输出源。

科特林片段:

fun switchOutput(inCommunication: Boolean) {

    //STEP 1: Change the AudioManager's audio mode
    if(inCommunication) {
        audioManager.mode = AudioManager.MODE_IN_CALL
        audioManager.isSpeakerphoneOn = false
    } else {
        audioManager.mode = AudioManager.MODE_NORMAL
        audioManager.isSpeakerphoneOn = true
    }

    //STEP 2: Recreate the MediaPlayer
    if (player != null) {
        try {
            player?.stop()
        } catch (e: RuntimeException) {
        } finally {
            player?.reset()
            player?.release()
            player = null
        }
    }

    player = MediaPlayer()
    try {
        val streamType =
                if (inCommunication) AudioManager.STREAM_VOICE_CALL
                else AudioManager.STREAM_MUSIC
        player?.setDataSource(dataSource)
        player?.setAudioAttributes(AudioAttributes.Builder()
                .setLegacyStreamType(streamType)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build())
        player?.prepare()
        player?.start()
    } catch (e: java.lang.Exception) {}
}

希望这可以帮助 :)

PS 注意我使用了MODE_IN_CALL而不是MODE_IN_COMMUNICATION

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM