2016-11-09 8 views
1

私はjavaFXとFXMLで書かれたアプリケーションにVLCJプレーヤーを追加する方法を学んでいます。私はキャンバスに追加しなければならなかった他の質問を読みました。アンカーパネルの下にFXML。JavaFXのキャンバスにVLCJメディアプレーヤーを追加

<Canvas fx:id="mediaPlayerCanvas" height="174.0" layoutX="-4.0" layoutY="-2.0" width="595.0" /> 

その後、私は私のapplication.javaに

@FXML 
public void mediaPlayerCanvas() 
{ 
mediaPlayer = new MediaPlayer(); 
} 

それを初期化し、最終的に私はこの

package Lasercontroller; 


import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.RootPaneContainer; 
import javax.swing.SwingUtilities; 

import javafx.embed.swing.JFXPanel; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.layout.Pane; 
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; 
import uk.co.caprica.vlcj.discovery.NativeDiscovery; 

public class MediaPlayer { 
private final Canvas canvas; 

private final EmbeddedMediaPlayerComponent mediaPlayerComponent; 

public synchronized void start(final String[] args) { 
    new NativeDiscovery().discover(); 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new MediaPlayer(); 
     } 
    }); 
} 

public MediaPlayer() { 
    canvas = new Canvas(); 
    //canvasl.setBounds(100, 100, 600, 400); 


    String mediaLocation = "rtsp://192.168.1.175/stream1"; 
    canvas.setVisible(true); 
    mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 
    //panel.setContentPane(mediaPlayerComponent); 

    mediaPlayerComponent.getMediaPlayer().playMedia(mediaLocation); 

} 


} 

私は自分のアプリケーションを実行すると、私は例外を取得が含まれていることをMediaPlayer.javaを作成しましたThe video surface component must be displayable

どうしたのですか?私は他の多くの質問を読んだが、私はそれらを理解していない。

答えて

1

クラスuk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponentjava.awt.Panelから継承します。これはAWTコンポーネントであり、JavaFXとはまったく関係ありません。これは、AWTまたはSwingで使用するように設計されています。

一見すると、JavaFXアプリケーションの内部でjavafx.embed.swing.SwingNodeembed some Swing contentを使用することが1つの解決策と思われます。ただし、EmbeddedMediaPlayerComponentは重量コンポーネントであり、SwingNodeのjavadocは「JComponentインスタンスに含まれるコンポーネントの階層には重量のあるコンポーネントが含まれていてはいけません。そうでなければSwingNodeで塗りつぶされません」(this answer )。

私が知る限り、tehreはjavaFXでEmbeddedMediaPlayerComponentを使用する方法はありません。

可能な解決策の1つは、vlcjのDirectMediaPlayerComponentを使用して、JavaFX Canvasに各フレームを書き込むコードを実装することです。関連する例はon githubです。これはEmbeddedMediaPlayerComponentと効率的ではありません(パフォーマンスに関して)。

+0

あなたの答えをありがとう。私は 'DirectMediaPlayerComponent'を実装するのに数時間を費やしていますが、それ以上ではメディアを埋め込む代わりに新しいスイングフレームを再生することにしました。 –

関連する問題