提问人:Sashkoto 提问时间:11/9/2022 更新时间:11/10/2022 访问量:136
按顺序播放声音文件
Playing sound files in a sequence
问:
我正在尝试构建一个 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()
}
}
答:
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。
评论
playSound
completion
0
completion
1
playSound
MediaPlayer