【问题标题】:Trying to embed vlcj media player in a WindowsCanvas inside a JPanel试图将 vlcj 媒体播放器嵌入 JPanel 内的 WindowsCanvas
【发布时间】:2012-05-17 03:55:39
【问题描述】:

我正在尝试在 JPanel 中使用 vlcj 播放视频,但它对我不起作用。我得到的消息异常是“java.lang.IllegalStateException:视频表面组件必须是可显示的”,这与Keep getting an Error "Component must be displayable"中的问题相同。

包含画布和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 并且仅包含 MyJPanel JPanel。我认为这根本不重要。

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);
}   
}

提前致谢。

【问题讨论】:

  • 我可以问十几个问题,但它们都会在 1 SSCCE 中得到解答。为什么不发布 SSCCE?
  • @AndrewThompson 已编辑。谢谢。
  • O...K 这两个来源中的哪一个是 SSCCE?
  • @AndrewThompson 第一个。
  • 第一个没有主。将两者合并为一个源代码如 SSCCE 文档所述。如果需要,请继续浪费您的时间,但请停止浪费我的时间。 :(

标签: java video jpanel vlcj


【解决方案1】:

您正在尝试在包含画布的框架设置为可见之前播放媒体。您需要将playMedia() 调用放在一个单独的方法中,并在整个框架被创建并设置为可见之后调用它。

编辑:

如果您仍然希望它直接播放,只需在创建框架并使其可见后调用相关方法即可:

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

...显然您需要在 MyJFrame 上定义 startPlaying(),但它应该会立即开始播放。您只需要先将框架设置为可见。

【讨论】:

  • 您无法想象我多么感谢您的帮助。真的谢谢。我创建了一个 JButton 来开始播放。虽然,我更喜欢自动播放。什么原因?我不明白为什么它不运行。
  • 完美运行。框架是否决定绘制组件的不同顺序?
  • @honnix 这与绘画顺序无关,只是底层的 libvlc 库要求画布在屏幕上可见,然后才能在其上播放视频(这是一种简化,但想法是一样的。)
  • 我尝试了相同的代码,并在setVisible(true) 之后添加了playMedia(url),但是当我执行我的代码时,我只看到面板并且没有播放视频,控制台中没有错误!见my post
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多