2013-01-11 39 views
2

我在Eclipse RCP應用程序的編輯器中使用JavaFX播放視頻。在編輯器UI的初始化,我沿着線的東西:JavaFX 2.2 MediaPlayer:如何在Windows上釋放媒體文件句柄

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的媒體對象從未釋放視頻資源。在編輯器關閉時,我無法在javafx文檔中找到任何指針來要求Media或MediaPlayer對象釋放資源。

我的問題:如何確保javafx在編輯器關閉時發佈視頻文件?

回答

0

爲了什麼是值得的,我在JavaFX論壇上發佈了我的問題。作爲迴應,我被指出這張Jira票:http://javafx-jira.kenai.com/browse/RT-18224

票上的建議並沒有幫助我的情況,所以我堅持我的解決方法。

+0

我想這也和它沒有爲我既不工作。這肯定是javafx代碼中的一個錯誤,無法釋放輸入流或其他東西。此外,正如傑拉問題的評論所述,應該有明確的答案。 – langsweirdt

1

我遇到了相同(或類似)的問題。就我而言,我在獨立的Java Swing桌面應用程序中使用JavaFX MediaPlayer。我正在使用JRE 1.7.0_10和JavaFx 2.2.4-b18。該應用程序在Windows機器上運行。在我的情況下,有些媒體文件在播放後需要刪除。我碰巧使用Files.delete()方法。它總是拋出IOException異常,消息「進程無法訪問該文件,因爲它正在被另一個進程使用」,但只在最後播放的文件上這樣做。在嘗試刪除之前,我一定要在媒體播放器上調用stop()。

我還在Carl Dea的書「JavaFX 2.0 Introduction by Example」中的PlayingAudio示例中(第3-1章)重新創建了此場景,方法是修改上述示例以在停止的介質的File對象上調用delete()按鈕的事件處理程序。再次,我確保在停止媒體播放器後致電刪除。 (這個例子純粹是JavaFX,沒有Swing。)

對於什麼是值得的,我在Swing應用程序中解決這個問題的方法是在拋出前面提到的IOException的任何文件上調用deleteOnExit()。即使這樣,我必須確保在退出應用程序時我首先調用Platform.exit(),沒有它,deleteOnExit()也不起作用。

我希望這有些幫助。

0

如果我們在應用程序中加載許多文件並使用滑塊調用seek(),由於文件數量增加,應用程序的性能降低,操作系統的內存圖表顯示內存的增長率。在媒體問題上討論JavaFx內存泄漏。 現在,還有另一個Bug:https://javafx-jira.kenai.com/browse/RT-28379

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(); 
    } 
}); 
相關問題