如何正确使用MediaPlayer和Kotlin来重现声音?

问题描述 投票:0回答:1

我有两个按钮(一个用于成功,另一个用于失败)。我想在单击每个按钮时重现不同的声音。在销毁当前 Activity 之前,每个按钮都会被点击 100 次。

如果在单击任何按钮时播放两种声音,我想中断它们,以避免同时听到两种声音。为此,我创建了一个名为

stopSounds()
的函数,单击任何按钮时都会调用该函数。

此外,我在销毁 Activity 时释放了两种声音。我是否应该在应用程序的其他部分释放它们,例如每次它们玩完时?

这是我的代码摘要:

class MyClass : AppCompatActivity() {
    private var successSound: MediaPlayer? = null
    private var failSound: MediaPlayer? = null

    override fun onDestroy() {
        super.onDestroy()
        this.successSound.release()
        this.failSound.release()
    }

    override fun onCreate() {
        super.onCreate()
        ...
        val successBtn = findViewById<Button>(R.id.btn_success)
        val failBtn = findViewById<Button>(R.id.btn_fail)
        ...
        this.successSound = MediaPlayer.create(this, R.raw.success)
        this.failSound = MediaPlayer.create(this, R.raw.fail)
        ...
        successBtn.setOnClickListener {
            this.stopSounds()
            this.successSound!!.start()
        }
        failBtn.setOnClickListener {
            this.stopSounds()
            this.failSound!!.start()
        }
    }

    private fun stopSounds() {
        if (this.successSound?.isPlaying == true) {
            this.successSound!!.stop()
            this.successSound!!.prepare()
        }
        if (this.failSound?.isPlaying == true) {
            this.failSound!!.stop()
            this.failSound!!.prepare()
        }
    }
}

可以吗?我可以改进吗?我应该使用 SoundPool 吗?任何建议、更正或示例将不胜感激。预先感谢您。

android kotlin android-mediaplayer
1个回答
0
投票

是的,SoundPool似乎是此用例的首选选项。

  1. 短声音可以预先解码到内存中,从而实现低延迟播放。

  2. 您可以使用一个

    SoundPool
    实例(播放多种声音)而不是多个
    MediaPlayer
    实例。这简化了错误处理和状态管理。

  3. 每个

    MediaPlayer
    都保存数据源的文件描述符。应用程序可以保存的打开文件描述符的数量存在硬编码限制。如果您播放大量声音,这一点很重要。

© www.soinside.com 2019 - 2024. All rights reserved.