我在我的应用程序中播放从网络流式传输的mp3文件,一些mp3文件有奇怪的行为:mediaPlayer.getCurrentPosition()
最后大于mediaPlayer.getDuration()
,持续约3秒。
mp3文件是CBR编码的。
这可能是什么原因?
答案 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秒似乎有点太多,不能解释它,但这只是一个想法。