mediaPlayer.getCurrentPosition()> mediaPlayer.getDuration()在播放mp3文件结束时

时间:2017-04-24 10:38:35

标签: android audio android-mediaplayer

我在我的应用程序中播放从网络流式传输的mp3文件,一些mp3文件有奇怪的行为:mediaPlayer.getCurrentPosition()最后大于mediaPlayer.getDuration(),持续约3秒。

mp3文件是CBR编码的。

这可能是什么原因?

2 个答案:

答案 0 :(得分:5)

最后通过转换mp3文件解决了这个问题,这是我正在使用的命令:

lame --mp3input -t -m s -b 128 --cbr input.mp3 output.mp3

答案 1 :(得分:2)

有几个原因可以解决这种问题。

首先看来人们使用完全44100Hz的mp3文件会有更好的结果,因为显然MediaPlayer类假定这个值并相应地缩放时间,为不使用此采样的文件制作奇怪的值

您还需要检查频道的模式,并尝试使用Joint Stereo或强制L / R立体声。联合应该是默认值,但您的文件可能以前编码错误,因此值得尝试。值得注意的是,Forced L / R Stereo可能会以与Joint相同的比特率来降低质量。

检查作为sox包的一部分的soxi的输出也是有用的(你也可以用ffmpeg来做),这将为你提供通道数,采样率,比特率和频道数。

如果您使用任何应用程序对其进行了一些处理,您可能需要检查mp3文件的原始内容,以确定是否存在可能在导出期间插入的垃圾xml内容。

如果你有可能修改你正在播放的mp3文件(这听起来像你可以告诉你的比特率)这些是我先尝试的。如果它更像是用户上传类型的东西,也许你应该看看另一个解决方案,比如ExoPlayer,它有几千颗星并且活跃开发。它仍然包裹MediaPlayer api,但值得一试。

你还必须考虑它可能是一个线程问题,玩家会停止播放,但计时器实际上会继续前进,给你这个结果,它优于歌曲的实际持续时间。 3秒似乎有点太多,不能解释它,但这只是一个想法。