Java vlcj JPanel draw-over mediaPlayerComponent

Java vlcj JPanel draw-over mediaPlayerComponent,java,swing,video,vlc,vlcj,Java,Swing,Video,Vlc,Vlcj,我有一个功能齐全的基于VLCj的视频播放器,如下图所示 工作代码 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.Embedde

我有一个功能齐全的基于VLCj的视频播放器,如下图所示

工作代码

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后,我遇到了这个错误:没有显示任何视频

[00000000 29D930E0]avi解复用错误:没有为轨道0设置关键帧

[00000000 29E035D0]核心vout显示错误:未能设置在顶部


您根本无法使用Java2D在重量级AWT
Canvas
video界面上绘制

但是,您可以使用许多其他方法在视频顶部进行渲染:

  • 使用本机字幕API-这仅限于文本呈现
  • 使用本机徽标API-当然,这仅限于渲染位图图像,而不是绘制矩形之类的基本体
  • 使用“直接”媒体播放器-这里您自己渲染视频,您可以使用Java2D在视频顶部进行渲染。但是,直接渲染媒体播放器在性能方面要求更高
  • 在视频表面的顶部覆盖一个透明的顶级窗口,并以通常的方式使用Java2D渲染到该窗口中。这并不理想,因为必须使覆盖窗口与视频表面的位置和大小保持同步,这样做可能会滞后。vlcj有一个API可以帮助实现这一点,还有一个示例应用程序可以演示:
  • 我认为#4虽然不理想,但可能是你所能做的最好的,并且最接近你的要求。

    你有没有看过?