我在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发布视频文件?
答案 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();
}
});