Android 对于SoundPool和MediaPlayer,循环播放的嘟嘟声在一段时间后停止
我试着连续播放一个简短的mp3声音(嘟嘟声),每分钟100次。它可以正确播放30-45次(在较新的设备上播放更多),然后停止一段时间(约30秒),然后再次播放(仅10次) 我尝试了Android 对于SoundPool和MediaPlayer,循环播放的嘟嘟声在一段时间后停止,android,kotlin,android-mediaplayer,mp3,soundpool,Android,Kotlin,Android Mediaplayer,Mp3,Soundpool,我试着连续播放一个简短的mp3声音(嘟嘟声),每分钟100次。它可以正确播放30-45次(在较新的设备上播放更多),然后停止一段时间(约30秒),然后再次播放(仅10次) 我尝试了SoundPool(playBeepSound1)和MediaPlayer(playBeepSound2),所以可能我使用的处理程序是错误的 private val delay: Float = 60.0F / 100.0F * 1000.0F // 100 times per minute priv
SoundPool
(playBeepSound1
)和MediaPlayer
(playBeepSound2
),所以可能我使用的处理程序是错误的
private val delay: Float = 60.0F / 100.0F * 1000.0F // 100 times per minute
private var handler: Handler? = null
private var soundPool: SoundPool? = null
private var mediaPlayer: MediaPlayer? = null
override fun onResume() {
super.onResume()
startBeeping()
}
private fun startBeeping() {
handler = Handler()
handler?.postDelayed(object : Runnable {
override fun run() {
handler?.postDelayed(this, delay.toLong())
playBeepSound1() // SoundPool
// playBeepSound2() // MediaPlayer
}
}, delay.toLong())
}
private fun playBeepSound1() {
val attributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build()
soundPool = SoundPool.Builder()
.setAudioAttributes(attributes)
.build()
soundPool?.setOnLoadCompleteListener { soundPool, soundId, _ ->
soundPool.play(soundId, 1.0f, 1.0f, 0, 0, 1.0f);
}
soundPool?.load(baseContext, R.raw.beep_sound, 1)
}
private fun playBeepSound2() {
mediaPlayer = MediaPlayer.create(this, R.raw.beep_sound)
mediaPlayer?.start()
}
override fun onPause() {
super.onPause()
stopBeeping()
}
private fun stopBeeping() {
handler?.removeCallbacks(this)
handler = null
soundPool?.release()
soundPool = null
mediaPlayer?.release()
mediaPlayer = null
}
关于如何在循环中播放短声音,有什么想法吗
更新:
我在不同操作系统版本的不同设备上测试了它(安卓6,安卓9,还有模拟器),结果几乎相同。唯一的区别是它停止鸣叫后的时间
mp3文件的大小为5KB。我不知道kotlin,但我在Java中使用MediaPlayer时会这样做
MediaPlayer player=MediaPlayer.create(MainActivity.this,R.raw.beep_sound);
for(int i=0;i<45;i++){
//the for loop will make it run 45 times
player.start();
//wait for 600 milliseconds because it's 100 times a minute
Thread.sleep(600);
}
//stop for 30 seconds
Thread.sleep(30000);
//then this time play 10 times only
for(int i=0;i<10;i++){
player.start();
Thread.sleep(600);
}
MediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.beep_声音);
对于(int i=0;ii在这两种情况下,您每次播放时都会创建新的实例,而从不释放旧的实例。相反,创建一个实例,然后反复播放。@MikeM。您是对的!创建一个实例后,MediaPoolstart()
工作正常,但SoundPoolplay()
不播放任何声音…谢谢你的回答,但是1)30秒的暂停是一个错误,不是一个要求2)我更喜欢处理程序而不是调用睡眠函数。