2016-06-01 9 views
1

У меня есть полностью функциональный видеопроигрыватель VLCj, как показано ниже.vlcj JPanel draw over mediaPlayerComponent

Рабочий код

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

Вы просто не можете использовать Java2D рисовать на вершине супертяжелого AWT Canvas видео поверхности.

Есть, однако, ряд других подходов, которые можно использовать для визуализации на верхней части видео:

  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, в то время как не идеальный, вероятно, лучшее, что можно сделать, и ближе всего к тому, что вы просите ,

 Смежные вопросы

  • Нет связанных вопросов^_^