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
我在我的应用程序中播放从网络流式传输的 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