2016-06-01 3 views
1

필자는 아래와 같이 VLCj 기반 비디오 플레이어를 완벽하게 갖추고 있습니다.vlcj JPanel drawPlayerComponent

작동 코드 (예를 들어 사각형을) 비디오를 통해 그릴

는 내가 필요로하는 것은 비디오를 통해 끌어하기 위해 코드에

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; 
import uk.co.caprica.vlcj.discovery.NativeDiscovery; 

/** 
* Minimal quick-start example. 
*/ 
public class Example1 { 

    private final JFrame frame; 

    private final EmbeddedMediaPlayerComponent mediaPlayerComponent; 

    public static void main(String[] args) { 
     new NativeDiscovery().discover(); 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Example1().start("file:///C:/video.avi"); 
      } 
     }); 
    } 

    public Example1() { 
     mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 

     frame = new JFrame("vlcj quickstart"); 
     frame.setLocation(50, 50); 
     frame.setSize(1400, 800); 
     frame.getContentPane().setLayout(new BorderLayout()); 
     frame.getContentPane().add(mediaPlayerComponent, BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(320, 240)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void start(String mrl) { 
     mediaPlayerComponent.getMediaPlayer().playMedia(mrl); 
    } 
} 

수정. 이를 위해 MyJPanel을 만들었습니다. 그리고 대신 라인의

class MyPanel extends JPanel { 
    private EmbeddedMediaPlayerComponent comp; 

    public MyPanel(EmbeddedMediaPlayerComponent mediaPlayerComponent) { 
     add(this.comp = mediaPlayerComponent); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawRect(10, 10, 200, 100); 
    } 
} 

:

frame.getContentPane().add(mediaPlayerComponent, BorderLayout.CENTER); 

나는 추가 :

frame.getContentPane().add(new MyPanel(mediaPlayerComponent), BorderLayout.CENTER); 

문제 :

MyPanel를 추가 한 후 나는이 오류가 무엇입니까 :없이 어떤 동영상이 표시됩니다.

[0000000029d930e0] avi demux error: no key frame set for track 0

[0000000029e035d0] core vout display error: Failed to set on top

+1

['Marquee] (http://capricasoftware.co.uk/#/projects/vlcj/tutorial/marquee)를 보았습니까? – trashgod

답변

1

당신은 단순히 헤비급 AWT Canvas 비디오 표면 위에 그리는 Java2D에 사용할 수 없습니다. -이 텍스트 렌더링 제한됩니다

  1. 네이티브 천막 API를 사용하여

    그러나 당신이 비디오의 상단에 렌더링하는 데 사용할 수있는 다른 방법이 될 것입니다.

  2. 네이티브 로고 API를 사용하십시오. 물론 이것은 사각형과 같은 프리미티브를 그리는 것이 아니라 비트 맵 이미지를 렌더링하는 것으로 제한됩니다.
  3. '직접적인'미디어 플레이어 사용 - 비디오를 직접 렌더링하고 Java2D를 사용하여 비디오 위에 렌더링 할 수 있습니다. 그러나 미디어 플레이어를 직접 렌더링하는 것은 성능면에서 까다로운 작업입니다.
  4. 동영상 표면 위에 투명한 최상위 창을 중첩하여 일반적인 방식으로 Java2D를 사용하여 렌더링합니다. 오버레이 창이 비디오 화면의 위치 및 크기와 동기화되도록 유지해야하므로 화면이 지연 될 수 있으므로 이는 이상적이지 않습니다. vlcj이에 도움이되는 API, 그리고 보여주는 샘플 응용 프로그램이 있습니다 https://github.com/caprica/vlcj/blob/d4c6dd5a0cb9f617fe236ea55fcf21b3fea588e8/src/test/java/uk/co/caprica/vlcj/test/overlay/OverlayTest.java

내가 좋지 않은 반면, # 4 생각을, 아마 당신이 할 수있는 최선이고, 당신이 요구하는지에 가장 가까운 것입니다 .