2014-10-28 3 views
1

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 응답하시는 분께 감사드립니다! https://github.com/caprica/vlcj/issues/29 - - Failed to play video by vlcj in java

답변

1

당신은 정확하게 작동하지 않습니다 무슨 말을 실제로하지 :

시 : 여기 내가 체크 될 수 있습니다.

레이아웃에서 레이아웃 제약이 누락 된 것처럼 보입니다.

아마이 :

webcamPanel.add(canvas); 

이 같아야합니다

webcamPanel.add(canvas, BorderLayout.CENTER); 

그렇지 않으면 당신이 null 레이아웃 제약으로 캔버스를 추가.

사용자 인터페이스가 표시 될 때까지 비디오를 재생할 수 없기 때문에 "비디오 구성 요소를 표시 할 수 있어야합니다."오류가 발생합니다. pack() 프레임이 나타날 때까지 VLC에 Canvas에 대한 유효한 창 핸들이 없습니다. . 즉, 비디오를 재생하기 전에 frame.setVisible(true)을 실행해야합니다.

스레딩과 관련하여 일반적인 스윙 스레드 규칙이 적용됩니다. 즉, UI 구성 요소의 변경 사항이 EDT (Event Dispatch Thread)에서 호출되는지 확인해야합니다. 일반적으로 Swing 이벤트 리스너에 응답 할 때처럼 걱정할 필요가 없습니다. Swing 구성 요소의 생성 또는 조작을 시작하는 백그라운드 스레드 (Swing EDT가 아님)가있는 경우에만 이에 대해 신경 써야합니다. 이 작업을 수행해야하는 경우 SwingUtilities 클래스에서 invokeLater을 사용합니다. 나는 이것이 귀하의 경우에 필요하다고 생각하지 않지만, 더 많은 코드 없이는 말하기 어렵습니다.

주제와 약간 거리가 있지만 관련 코멘트 : 최신 버전의 vlcj에서는 훨씬 쉬운 방법이 있습니다. EmbeddedMediaPlayerComponent을 사용하여 미디어 플레이어, 비디오 표면 및 연결된 Canvas을 처리합니다. 구성 요소를 레이아웃에 추가하기 만하면됩니다.

+0

답변 해 주셔서 감사합니다. 좀 더 정확하게 내 질문을 업데이트하고 이제 EmbeddedMediaPlayer를 사용합니다. 그래도 나는 다음과 같은 결과를 얻었습니다. 비디오 표면 구성 요소를 표시 할 수 있어야합니다. 그게 무슨 뜻인지 아십니까? – Mornor

+0

감사합니다. 저에게 감사합니다. 나는 그 코드가 내가 지금 가지고있는 것이되도록 질문을 편집했다. 스트림을 재생하려고하기 전에 프레임을 표시하도록 설정했지만 여전히 동일한 오류가 발생합니다. 나는 왜 그런지 모르겠다. ... – Mornor

+0

오 예, 실제로 검은 색 사각형과 같은 제 패널의 플레이어와 같은 것을 가지고 있지만 오류는 여전히 있습니다. – Mornor