2016-06-01 19 views
1

Ich habe voll funktionsfähige VLCj-basierte Video-Player wie unten gezeigt.vlcj JPanel zeichnen über mediaPlayerComponent

Arbeits Code

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

Änderungen am Code, um das Video zu ziehen über

Was ich brauche, ist das Video ziehen über (zum Beispiel ein Rechteck). Zu diesem Zweck habe ich MyJPanel erstellt.

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

Und statt der Zeile:

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

ich hinzugefügt:

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

Problem:

Nach der Zugabe von MyPanel ich diese Störung erhalte: und keine jede mögliche Video wird angezeigt.

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

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

+1

Haben Sie ein ['Marquee'] (http://capricasoftware.co.uk/#/projects/vlcj/tutorial/marquee) angeschaut? – trashgod

Antwort

1

Sie können einfach nicht Java2D verwenden auf dem Schwergewicht AWT Canvas Videooberfläche zu ziehen.

Es gibt jedoch eine Reihe anderer Ansätze, die Sie auf dem Video zu machen, verwenden können:

  1. Verwenden Sie die native Marquee API - das ist beschränkt auf Text-Rendering.
  2. Verwenden Sie die native Logo-API - natürlich beschränkt sich das auf das Rendern von Bitmap-Bildern, nicht das Zeichnen von Grundelementen wie ein Rechteck.
  3. Verwenden Sie einen "direkten" Media Player - hier rendern Sie das Video selbst und Sie können Java2D verwenden, um über das Video zu rendern. Direct Rendering Media Player sind jedoch anspruchsvoller in Bezug auf die Leistung.
  4. Überlagern Sie ein transparentes Top-Level-Fenster oben auf der Videooberfläche und rendern Sie es wie gewohnt mit Java2D. Dies ist nicht ideal, da Sie das Overlay-Fenster mit der Position und Größe der Videooberfläche synchron halten müssen und dabei nacheilen können. vlcj hat eine API, die mit diesem hilft, und eine Beispielanwendung, die es zeigt: https://github.com/caprica/vlcj/blob/d4c6dd5a0cb9f617fe236ea55fcf21b3fea588e8/src/test/java/uk/co/caprica/vlcj/test/overlay/OverlayTest.java

Ich denke, # 4, die zwar nicht ideal, ist wahrscheinlich das Beste, was Sie tun können, und am nächsten ist, was Sie für Fragen .