在Canvas中显示VLCJ播放器

时间:2014-10-28 10:50:04

标签: java swing canvas vlcj

我尝试将VLCJ播放器放入画布中。 我已经阅读了很多关于它的主题,但我仍然无法实现我想做的事情。

以下是我使用的代码:

public class RaspberryControler extends JFrame 
{

    /*Have to declare it in order to use vlcj*/
    private EmbeddedMediaPlayerComponent mediaPlayerComponent;
    private EmbeddedMediaPlayer mediaPlayer;

    public RaspberryControler(String host){
       this.host = host;
       controler = new Controler(this);  
       initComponents();
    }

    private void initComponents(){      
      setBasicParameters();
      createMainPanel();
      createControlPanel(); 
      createWebcamPanel(); 
      mainPanel.add(webcamPanel); 
      mainPanel.add(controlPanel); 
      setListeners();       

      /*Set the last parameters of the frame*/
      this.revalidate();
      this.repaint();
      this.setDefaultCloseOperation(EXIT_ON_CLOSE);
      this.setLocationRelativeTo(null);     
   }

   private void createMainPanel(){

       mainPanel = new JPanel();

       /*Set the Layout*/
       mainPanel.setLayout(new FlowLayout());
       mainPanel.setVisible(true);

       /*Set the parameters*/ 
       this.getContentPane().add(mainPanel);
   }

    private void createWebcamPanel(){       
      /*Get the VLC Libraries*/
    NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:/VLC/VideoLAN/VLC");
    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);

    /*Create components*/
    liveStream = new JLabel("Live Stream"); 
    mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 

    /*Set parameters of the components*/
    liveStream.setPreferredSize(new Dimension(200, 30));
    liveStream.setHorizontalAlignment(SwingConstants.CENTER);

    /*Set the layout*/
    webcamPanel = new JPanel();
    webcamPanel.setLayout(new BorderLayout()); 
    webcamPanel.setPreferredSize(new Dimension(550, 480));
    webcamPanel.setBorder(BorderFactory.createLineBorder(Color.RED));

    /*Place the components*/
    webcamPanel.setVisible(true);
    webcamPanel.add(liveStream, BorderLayout.NORTH);        
    webcamPanel.add(mediaPlayerComponent, BorderLayout.CENTER);

    this.setVisible(true); 

    try{
        mediaPlayerComponent.getMediaPlayer().playMedia("http://127.0.0.1:8989/movie");
    }catch(IllegalStateException e){
        System.out.println(e.toString());
    }
}

然后,当然,WebcamPanel被添加到当前的JFrame中。

我做错了什么?

这是输出:The video surface component must be displayable 感谢那些愿意回应的人!

Ps:这是我检查的主题: - https://github.com/caprica/vlcj/issues/29 - Failed to play video by vlcj in java

1 个答案:

答案 0 :(得分:1)

你实际上并没有准确说出什么不起作用。

从表面上看,您似乎缺少布局约束。

可能这个:

webcamPanel.add(canvas);

应该是这样的:

webcamPanel.add(canvas, BorderLayout.CENTER);

否则,您将使用null布局约束添加Canvas。

“视频组件必须可显示”错误是因为在用户界面可显示之前无法播放视频 - 在您pack()帧之前,VLC没有Canvas的有效窗口句柄,或者让它可见。简而言之,在播放视频之前,您应该frame.setVisible(true)

与线程相关,通常的Swing线程规则适用 - 即您必须确保在事件调度线程(EDT)上调用UI组件的更改。通常,您不必担心这一点,例如当您响应Swing事件侦听器时。如果你有一个后台线程(不是Swing EDT)来启动Swing组件的创建或操作,你只需要担心这个问题。如果您需要这样做,请在invokeLater课程上使用SwingUtilities。在你的情况下我不认为这是必要的,但没有更多的代码,很难说。

稍微偏离主题但相关的评论:对于现代版本的vlcj,有更简单的方法可以做到这一点,例如:通过使用EmbeddedMediaPlayerComponent,它可以为您处理媒体播放器,视频表面和相关的Canvas。您只需将组件添加到布局中即可完成。