按顺序播放声音文件

Playing sound files in a sequence

提问人:Sashkoto 提问时间:11/9/2022 更新时间:11/10/2022 访问量:136

问:

我正在尝试构建一个 Android 应用程序(用 Kotlin 编码),该应用程序播放一个随机声音文件,完成后播放另一个随机文件,依此类推。使用当前版本的代码,似乎可以同时播放多个文件,而不是等待前一个文件完成。

在我的代码中的注释行中,我尝试为每次播放音乐文件实现倒数计时器。它会导致以下结果:当我启动应用程序时,播放了一个文件,然后它停止了(可能崩溃)

class MainActivity : AppCompatActivity() {


    fun playSound(running:Int) {

        var completition=1
        while (running==1 && completition==1) {

            completition=0
            var rnds = Random.nextInt(0..1)

            if (rnds==1 ) {
                val mMediaPlayer = MediaPlayer.create(this, R.raw.right)
                mMediaPlayer!!.isLooping = false

                mMediaPlayer!!.start()
                mMediaPlayer!!.setOnCompletionListener { completition=1 }


            }
            if (rnds==0 ) {val mMediaPlayer = MediaPlayer.create(this, R.raw.left)
            mMediaPlayer!!.isLooping = false

            mMediaPlayer!!.start()
                mMediaPlayer!!.setOnCompletionListener { completition=1 }
            }



        }

    }
    fun music(){
        var i=1
       while(i==1) {
           i=0
           val random=(0..1).random()
           if (random==1){
           val refMediaPlayer=MediaPlayer.create(this,R.raw.right)
               refMediaPlayer!!.isLooping = false

               refMediaPlayer!!.start()
               //object :CountDownTimer(1000,100) {
                   //override fun onTick(p0: Long) {
                      // TODO("Not yet implemented")
                  // }

                   //override fun onFinish() {
                       //i=1
                   //}

              // }.start();
           }
           if (random==0){
               val refMediaPlayer=MediaPlayer.create(this,R.raw.left)
               refMediaPlayer!!.isLooping = false

               refMediaPlayer!!.start()
              // object :CountDownTimer(1000,100) {
                   //override fun onTick(p0: Long) {
                     //  TODO("Not yet implemented")
                  // }

                  // override fun onFinish() {
                      // i=1
                  // }

               //}.start();

           }


       }

    }


    // 4. Destroys the MediaPlayer instance when the app is closed
   // override fun onStop() {
   //     super.onStop()
    //    if (mMediaPlayer != null) {
    //        mMediaPlayer!!.release()
      //      mMediaPlayer = null
       // }
    //}
    override fun onCreate(savedInstanceState: Bundle?) {
        val running=1
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        music()
    }


}
Kotlin 音频 Android-Music-Player Soundpool

评论

0赞 cactustictacs 11/10/2022
您的方法运行一次 while 循环,然后退出(因为是)。那些设置为稍后的完成侦听器不会执行任何操作,因为循环已完成。如果您希望它们播放另一种声音,完成侦听器应再次调用(这将无限发生,因此您可能希望传入一个重复计数参数,该参数在每次调用时递减,如果重复为 <1),则跳过重复)。此外,您应该有一个可以重用(和停止)的顶级实例,不要在每次播放声音时都创建一个playSoundcompletion0completion1playSoundMediaPlayer

答:

0赞 Rob 11/10/2022 #1

我在我构建的应用程序中遇到了类似的问题。我最终将所有声音放在一个单独的线程上,并在每个音频文件的持续时间内暂停线程。所以像这样:

// off the main thread
val refMediaPlayer=MediaPlayer.create(this,R.raw.right)
refMediaPlayer!!.isLooping = false
refMediaPlayer!!.start()

// put the exact length of your sound file here in milliseconds
// 5000 = 5 seconds
Thread.sleep(5000L)

声音将继续播放,但代码的执行将在您指定的时间内暂停。

我不确定 Kotlin 的确切语法,因为我使用 Java。