3

我在 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 文档中找不到任何指针来要求 Media 或 MediaPlayer 对象在编辑器关闭时释放资源。

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

4

4 回答 4

1

刚刚遇到同样的问题,经过大量阅读后,我发现了这篇文章(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();
    }
});
于 2016-06-03T07:06:12.463 回答
0

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

票证中的建议对我的情况没有帮助,所以我坚持我的解决方法。

于 2013-01-25T13:28:58.517 回答
0

如果我们在应用程序中加载许多文件并使用滑块调用 seek(),由于文件数量增加,应用程序的性能会相应下降,并且操作系统的内存图显示内存的增加率。看起来像 JavaFx 内存泄漏在媒体问题上。现在,还有另一个错误:https ://javafx-jira.kenai.com/browse/RT-28379

于 2014-05-22T00:04:55.790 回答
0

我遇到了相同(或类似)的问题。在我的例子中,我在一个独立的 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 章)中重新创建了这个场景,方法是修改上述示例以在停止按钮的事件处理程序中调用媒体文件对象上的 delete()。同样,我确保在停止媒体播放器后调用 delete。(这个例子纯粹是 JavaFX,没有 Swing。)

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

我希望这会有所帮助。

于 2013-01-23T19:58:23.480 回答