JavaFx 组件 MediaPlayer 在播放 MP3(320kb/s) 时调用 seek() 导致 getCurrentTime() 返回值与实际播放值不一致的问题

写在前面:

之前一直使用酷狗播放器里的一个铃声制作工具, 后来找不到了. 于是决定自己动手写个简单的小工具.

使用了JavaFX来做界面, MediaPlayer来播放, Slider来做进度条, 在过程中涉及到了1个点:

如何拖动进度条更改播放进度.

1
2
3
4
5
timeSlider.valueProperty().addListener(observable -> {
if (timeSlider.isValueChanging()) {
mediaPlayer.seek(new Duration(timeSlider.getValue()));
}
});
正题:

上面的代码, 当slider拖动时, 其value改变, 触发事件, 调用MediaPlayer的seek函数, 问题就会出现:显示的当前时间, 总要比实际播放的音乐晚4-?秒, debug进seek的方法也没有发现异常, 执行了native的方法之后, 问题就出现了, 于是google了一段时间, 终于发现了openJDK的bug管理平台报告了这个问题:https://bugs.openjdk.java.net/browse/JDK-8151164, 并承诺在9中修复(这个bug目前的状态仍然是open…), 但具体是哪个小版本号没细找, 我是直接升到了10测试了一次, 问题已经修复了.

PS:

我尝试寻找了究竟是在哪次提交的时候, 修改了哪些代码修复了这个bug, 但是没有找到, 如果有知道的, 请发邮件给我, 谢谢. mailto:shenhongliang4u@foxmail.com

openjfx变更地址:http://hg.openjdk.java.net/openjfx

我使用了bug编号搜索, 没有找到.

最后放出两个github上不错的项目:

  1. https://github.com/mifi/lossless-cut

    可以跨平台使用, 截切音频和视频. 我试了在windows 10上剪切MP3没有问题.

  2. https://github.com/zyl409214686/Mp3Cutter

    android端使用的, 我关于mp3文件的计算和剪切文件的生成用了这个项目的代码.

  3. https://github.com/isCoding/MP3cutter

    我自己的项目, 逃:)