JavaFX 2.2 MediaPlayer:如何在Windows上释放媒体文件句柄



我在Eclipse RCP应用程序的编辑器中使用JavaFX来播放视频。在编辑器UI初始化期间,我做了以下操作:

canvas = new FXCanvas(imageSection, SWT.NONE);
canvas.setScene(createScene());
...
// createScene()
Media media = new Media(file.toURI().toString());
MediaPlayer player = new MediaPlayer(media);
MediaView view = new MediaView(player);
...
player.play();

在编辑器的dispose方法中,我确保视频停止播放:

@Override
public void dispose() {
    player.stop();
    super.dispose();
}

但是,如果我想在编辑器关闭后删除正在编辑器中播放的视频资源(无论是从我自己的应用程序还是从windows资源管理器),该文件不能被删除,因为它仍在被我的应用程序使用。看起来fx的Media对象从未释放过视频资源。我在javafx文档中找不到任何指针来要求媒体或MediaPlayer对象在编辑器关闭时释放资源。

我的问题:如何确保javafx在编辑器关闭时释放视频文件?

刚刚有同样的问题,经过大量的阅读,我发现这篇文章(https://bugs.openjdk.java.net/browse/JDK-8123986)。最后一个建议是简单地在MediaPlayer对象上使用dispose(),这对我来说很好。

如果你需要确保在音频播放后释放文件,你可以这样做:

File recording = new File("recording.mp3");
Media media = new Media(recording.toURI().toString());
final MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.play();
mediaPlayer.setOnEndOfMedia(new Runnable() {
    @Override
    public void run() {
        mediaPlayer.dispose();
    }
});

为了它的价值,我在JavaFX论坛上发布了我的问题。作为回应,我被指向这个Jira票:http://javafx-jira.kenai.com/browse/RT-18224

通知单上的建议对我的情况没有帮助,所以我只能用我的变通办法。

我也遇到过同样(或类似)的问题。在我的例子中,我在一个独立的Java Swing桌面应用程序中使用JavaFX MediaPlayer。我使用的是JRE 1.7.0_10和JavaFx 2.2.4-b18。该应用程序在Windows机器上运行。在我的情况下,有些情况下,一些媒体文件需要删除后,他们已经播放。我碰巧使用的是Files.delete()方法。它总是抛出IOException消息"进程不能访问文件,因为它正在被另一个进程使用",但只对最后播放的文件这样做。在尝试删除之前,我要确保在媒体播放器上调用stop()。

我还在Carl Dea的书《JavaFX 2.0示例介绍》中的PlayingAudio示例(第3-1章)中重新创建了这个场景,通过修改上述示例,在停止按钮的事件处理程序中对媒体的File对象调用delete()。再次,我确保在停止媒体播放器后调用删除。(这个例子是纯JavaFX,没有Swing)

为了它的价值,我在我的Swing应用程序中解决这个问题的方法是在抛出我前面提到的IOException的任何文件上调用deleteOnExit()。即使这样,我也必须确保在退出应用程序时首先调用Platform.exit(),否则deleteOnExit()也无法工作。

如果我们在应用程序中加载许多文件,并使用slider调用seek(),随着文件数量的增加,应用程序的性能相应下降,操作系统的内存图显示内存比例增加。看起来像是JavaFx内存泄漏的媒体问题。现在,有另一个Bug: https://javafx-jira.kenai.com/browse/RT-28379

最新更新