2016-06-01 1 views
1

J'ai un lecteur vidéo basé sur VLCj entièrement fonctionnel comme illustré ci-dessous.vlcj JPanel dessine sur mediaPlayerComponent

Code de travail

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

des modifications au code afin de tirer sur la vidéo

Ce que je dois est de tirer sur la vidéo (par exemple un rectangle). Pour ce faire, j'ai créé 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); 
    } 
} 

Et au lieu de la ligne:

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

I ajouté:

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

Problème:

Après avoir ajouté MyPanel Je reçois cette erreur: et pas tout la vidéo est en cours d'affichage.

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

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

+1

Avez-vous regardé un ['Marquee'] (http://capricasoftware.co.uk/#/projects/vlcj/tutorial/marquee)? – trashgod

Répondre

1

Vous ne pouvez pas utiliser Java2D pour tirer au-dessus du poids lourd AWT Canvas surface vidéo.

Il existe cependant un certain nombre d'autres approches que vous pouvez utiliser pour le rendu sur le dessus de la vidéo:

  1. Utilisez l'API native chapiteau - c'est limité à un rendu de texte.
  2. Utilisation de l'API du logo natif - bien sûr, elle se limite au rendu d'images en mode point, et non aux primitives de dessin comme un rectangle. Utilisez un lecteur multimédia 'direct' - ici vous visualisez la vidéo vous-même et vous pouvez utiliser Java2D pour le rendu sur la vidéo. Cependant, les lecteurs multimédias à rendu direct sont plus exigeants en termes de performances. Superposer une fenêtre de haut niveau transparente sur le dessus de la surface vidéo et de rendre en utilisant Java2D de la manière habituelle. Ce n'est pas idéal, car vous devez maintenir la fenêtre de superposition en phase avec la position et la taille de la surface vidéo et, ce faisant, elle peut être décalée. vlcj a une API qui aide à cela, et un exemple d'application qui le démontre: https://github.com/caprica/vlcj/blob/d4c6dd5a0cb9f617fe236ea55fcf21b3fea588e8/src/test/java/uk/co/caprica/vlcj/test/overlay/OverlayTest.java

Je pense # 4, alors que pas idéal, est probablement le meilleur que vous pouvez faire et est plus proche de ce que vous demandez .