JavaFX 2.2 MediaPlayer:如何在Windows上发布媒体文件句柄

时间:2013-01-11 16:42:27

标签: swt eclipse-rcp javafx-2

我在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();

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

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

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

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

4 个答案:

答案 0 :(得分: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 Example by Example”中的PlayingAudio示例(第3-1章)中重新创建了这个场景,修改了上述示例,在停止按钮的媒体文件对象上调用delete()事件处理程序再次,我确保在停止媒体播放器后调用删除。 (这个例子纯粹是JavaFX,没有Swing。)

对于它的价值,我在Swing应用程序中解决这个问题的方法是在任何抛出我之前提到的IOException的File上调用deleteOnExit()。即便如此,我必须确保在退出应用程序时我首先调用Platform.exit(),否则deleteOnExit()也无法正常工作。

我希望这会有所帮助。

答案 1 :(得分:0)

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

机票中的建议对我的情况没有帮助,所以我坚持使用我的解决方案。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

刚刚遇到同样的问题,经过大量阅读后我发现了这篇文章(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();
    }
});