是它可能预加载播放列表从网络与android mediaplayer?

raogr8fs  于 2024-01-04  发布在  Android
关注(0)|答案(1)|浏览(125)

我正在开发一个应用程序,涉及到收听从网络异步加载的音轨的播放列表。这里的问题是使用mediaplayer,我加载(准备)每个音轨后,其他,这会导致播放曲目之间的轻微延迟,我不想要。我想知道是否有一种方法可以先加载/准备整个曲目列表,然后播放它们。.有没有办法做到这一点?
我现在的逻辑是这样的:

  1. var currentPlayingIndex = mutableStateOf(0)
  2. val _playList=["url","url","url","url","url","url"]
  3. mediaPlayer.apply {
  4. reset()
  5. setDataSource("url to audio")
  6. prepareAsync()
  7. setOnPreparedListener {
  8. if (_isPlaying.value) {
  9. println("current ${currentPlayingIndex.value}")
  10. it.start()
  11. }
  12. }
  13. setOnCompletionListener {
  14. currentPlayingIndex.value++
  15. playAudio(
  16. _playList[currentPlayingIndex.value],
  17. context,
  18. mediaPlayer
  19. )
  20. }
  21. }

字符串

mqxuamgl

mqxuamgl1#

您可以使用setOnBufferingUpdateListenersetOnInfoListener实现类似的效果。在此代码中,当当前曲目达到最后30秒左右时,它开始缓冲下一个曲目,一旦当前曲目结束,下一个曲目开始播放,没有任何间隙。这被称为无间隙播放。

  1. var currentPlayingIndex = mutableStateOf(0)
  2. val _playList = listOf("url1", "url2", "url3", "url4", "url5", "url6")
  3. var mediaPlayer: MediaPlayer? = null
  4. fun prepareAndPlay(index: Int) {
  5. mediaPlayer = MediaPlayer()
  6. mediaPlayer?.setDataSource(_playList[index])
  7. mediaPlayer?.prepareAsync()
  8. mediaPlayer?.setOnPreparedListener {
  9. if (_isPlaying.value && currentPlayingIndex.value == index) {
  10. it.start()
  11. }
  12. }
  13. mediaPlayer?.setOnCompletionListener {
  14. currentPlayingIndex.value++
  15. if (currentPlayingIndex.value < _playList.size) {
  16. prepareAndPlay(currentPlayingIndex.value)
  17. }
  18. }
  19. mediaPlayer?.setOnBufferingUpdateListener { _, percent ->
  20. if (percent >= 95 && mediaPlayer?.duration?.minus(mediaPlayer?.currentPosition ?: 0)!! <= 30000) {
  21. currentPlayingIndex.value++
  22. if (currentPlayingIndex.value < _playList.size) {
  23. prepareAndPlay(currentPlayingIndex.value)
  24. }
  25. }
  26. }
  27. }
  28. fun startPlayback() {
  29. if (mediaPlayer == null) {
  30. prepareAndPlay(currentPlayingIndex.value)
  31. }
  32. }

字符串
在上面的代码中,你可以改变你想在哪里流你的下一首歌,我已经添加了30000,这是30秒前结束的轨道。调整代码根据您的要求。

展开查看全部

相关问题