我尝试将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
答案 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
。您只需将组件添加到布局中即可完成。