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

mediaPlayer.getCurrentPosition() > mediaPlayer.getDuration() at the end of playing mp3 file

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

mp3 文件经过 CBR 编码。

这可能是什么原因?

出现这种行为的原因有几个。

首先,人们似乎在恰好 44100Hz 时使用 mp3 文件获得了更好的结果,因为显然 MediaPlayer class 正在假设此值并相应地缩放时间,从而产生奇怪的值对于不使用此采样的文件。

您还需要检查您频道的模式,并尝试使用联合立体声或强制L/R 立体声。 Joint 应该是默认设置,但您的文件以前可能编码不当,因此值得一试。有趣的是,对于与 Joint.

相同的比特率,Forced L/R Stereo 可能会降低质量

检查 soxi 的输出也是有用的,它是 sox 包的一部分(你也可以用 ffmpeg 做),它会给你通道数,采样率、比特率和通道数。

如果您使用任何应用程序对 mp3 文件的原始内容进行了一些处理,以检查导出过程中可能插入的垃圾 xml 内容,您可能还想检查它们的原始内容。

如果您有可能修改您正在流式传输的 mp3 文件(这听起来像您所做的,因为您可以告诉比特率)这些是我首先尝试的。如果它更像是用户上传的东西,也许你应该看看另一个解决方案,比如 ExoPlayer,它有几千颗星并且正在积极开发。它仍然包含 MediaPlayer api,但值得一试。

您还必须考虑这可能是一个线程问题,播放器会停止播放,但计时器实际上会继续运行,从而为您提供优于歌曲实际持续时间的结果。 3秒似乎有点太多了,但这只是一个想法。

终于通过转换mp3文件解决了问题,这是我使用的命令:

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