4

JPanel内でvlcjを使用してビデオを再生しようとしていますが、機能しません。私が受け取っているメッセージ例外は「java.lang.IllegalStateException:ビデオサーフェスコンポーネントは表示可能である必要があります」です。これは、「コンポーネントは表示可能である必要があります」というエラーが発生し続ける場合と同じ問題です。

キャンバスとvlcjプレーヤーを含むJPanelのコードは次のとおりです。

import javax.swing.JPanel;

import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;

import java.awt.Canvas;
import java.awt.Color;

import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.player.embedded.videosurface.CanvasVideoSurface;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;
import uk.co.caprica.vlcj.runtime.windows.WindowsCanvas;

public class MyJPanel extends JPanel {
private EmbeddedMediaPlayer player;
private WindowsCanvas canvas;

public MyJPanel() {
    canvas = new WindowsCanvas();
    add(canvas);
    revalidate();
    repaint();

    canvas.setVisible(true);

    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
    player = mediaPlayerFactory.newEmbeddedMediaPlayer();

    CanvasVideoSurface videoSurface = mediaPlayerFactory.newVideoSurface(canvas);

    player.setVideoSurface(videoSurface);
    player.playMedia("v.avi");   // This sentence throws the exception.
}
}

MyJFrameはJFrameを拡張し、MyJPanelJPanelのみを含みます。それはまったく重要ではないと思います。

import javax.swing.JFrame;

public class MyJFrame extends JFrame {
protected MyJPanel myJPanel;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MyJFrame frame = new MyJFrame();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public MyJFrame() {
    myJPanel = new myJPanel();
    add(myJPanel);
}   
}

前もって感謝します。

4

1 に答える 1

8

キャンバスを含むフレームが表示されるように設定される前に、メディアを再生しようとしています。playMedia()呼び出しを別のメソッドに入れ、フレーム全体が作成されて表示されるように設定された後で呼び出す必要があります。

編集:

それでもすぐに再生したい場合は、フレームを作成して表示した後で、関連するメソッドを呼び出すだけです。

MyJFrame frame = new MyJFrame();
frame.setVisible(true);
frame.startPlaying();

...もちろん、MyJFrameで定義する必要がありますがstartPlaying()、そうするとすぐに再生が開始されます。最初にフレームを表示するように設定する必要があります。

于 2012-05-16T15:52:28.697 に答える