【发布时间】:2017-04-29 06:46:00
【问题描述】:
我正在使用 android 的 MediaPlayer 播放 .mp3 文件。此函数应寻求比当前位置大 30 秒的位置
fun jumpForward() {
val offset = 30_000
val old = mMediaPlayer.currentPosition
val new = if (old + offset < mPlayedBook.duration) old + offset else mPlayedBook.duration
Log.d("ProgressBar", "PlayerPresenter.rePlayFront, old: $old, new: $new")
mMediaPlayer.seekTo(new)
}
但有时进度条的指针会跳到错误的位置。有时甚至倒退。为了跟踪错误行为,我将日志放入 onSeekComplete 回调中:
override fun onSeekComplete(mp: MediaPlayer) {
Log.d("ProgressBar", "BookPlayer.onSeekComplete, currentPosition: ${mp.currentPosition / 1000}")
SystemClock.sleep(200)
Log.d("ProgressBar", "BookPlayer.onSeekComplete, currentPosition: ${mp.currentPosition / 1000}")
}
这是一个示例日志输出。这里我连续调用了几次 jumpForward() 方法:
`04-29 13:36:47.091 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onPrepared, currentPosition: 153
04-29 13:36:47.151 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 127
04-29 13:36:47.361 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 127
04-29 13:36:55.621 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 131, new: 161
04-29 13:36:55.631 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 161
04-29 13:36:55.831 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 100
04-29 13:36:57.071 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 101, new: 131
04-29 13:36:57.091 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 131
04-29 13:36:57.301 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 54
04-29 13:36:58.731 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 56, new: 86
04-29 13:36:58.741 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 86
04-29 13:36:58.941 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 71
04-29 13:37:00.481 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 73, new: 103
04-29 13:37:00.521 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 103
04-29 13:37:00.721 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 85
04-29 13:37:02.251 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 87, new: 117
04-29 13:37:02.281 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 117
04-29 13:37:02.481 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 117
04-29 13:37:03.991 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 118, new: 148
04-29 13:37:04.011 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 148
04-29 13:37:04.211 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 123
04-29 13:37:05.711 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 124, new: 154
04-29 13:37:05.721 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 154
04-29 13:37:05.931 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 128
04-29 13:37:07.571 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 130, new: 160
04-29 13:37:07.591 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 160
04-29 13:37:07.801 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 114
04-29 13:37:09.661 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 116, new: 146
04-29 13:37:09.681 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 146
04-29 13:37:09.881 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 121
04-29 13:37:11.611 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 123, new: 153
04-29 13:37:11.621 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 153
04-29 13:37:11.821 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 127
04-29 13:37:13.501 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 129, new: 159
04-29 13:37:13.511 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 159
04-29 13:37:13.721 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 132
04-29 13:37:15.061 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 133, new: 163
04-29 13:37:15.091 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 163
04-29 13:37:15.291 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 135
04-29 13:37:16.481 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 137, new: 167
04-29 13:37:16.521 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 167
04-29 13:37:16.721 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 104
04-29 13:37:17.691 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 105, new: 135
04-29 13:37:17.701 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 135
04-29 13:37:17.911 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 67
04-29 13:37:18.811 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 68, new: 98
04-29 13:37:18.821 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 98
04-29 13:37:19.031 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 81
04-29 13:37:20.381 27366-27366/ru.orgin.glagol.debug D/ProgressBar: PlayerPresenter.rePlayFront, old: 83, new: 113
04-29 13:37:20.411 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, before delay: 113
04-29 13:37:20.621 27366-27366/ru.orgin.glagol.debug D/ProgressBar: BookPlayer.onSeekComplete, currentPosition, after delay: 56
“延迟前”日志正确显示当前位置,因为它应该是在 seekTo() 调用之后。但是“延迟后”(我故意设置了 200 毫秒的延迟)经常显示错误的位置,有时甚至非常错误。
这是 MediaPlayer 中的错误还是其他问题?有没有办法克服这个问题?
更新:另一个问题似乎与各种 mp3 文件(VBR 和 CBR)有关。
override fun onPrepared(mp: MediaPlayer?) {
isPreparing = false
isPrepared = true
mp?.start()
mp?.seekTo(mProgressSeconds * 1000)
mp?.setOnBufferingUpdateListener { _, percent ->
bufferEndPercent = percent.toFloat() / 100
}
listeners.forEach { it.onPrepared() }
}
在这个函数中一切正常。除了在某些设备上,如果mProgressSeconds 的值超过大约 12 分钟,MediaPlayer 将无法找到正确的位置,并且几乎从文件的开头开始播放。
【问题讨论】:
-
这是android原生java代码吗?
-
它是用 kotlin 编写的
标签: android android-mediaplayer