vlcj JPanel 在 mediaPlayerComponent 上绘制 [英] vlcj JPanel draw over mediaPlayerComponent

查看:34
本文介绍了vlcj JPanel 在 mediaPlayerComponent 上绘制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have fully a functional VLCj-based video player as shown bellow.

工作代码

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.

What I need is to draw over the video (for example a rectangle). For this purpose I have created 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 后,我收到此错误:并且没有显示任何视频.

After adding MyPanel I am getting this error: and no any video is being displayed.

[0000000029d930e0] avi demux 错误:没有为轨道 0 设置关键帧

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

[0000000029e035d0]核心vout显示错误:无法设置在顶部

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

推荐答案

您根本无法使用 Java2D 在重量级的 AWT Canvas 视频表面上进行绘制.

You simply can not use Java2D to draw on top of the heavyweight AWT Canvas video surface.

不过,您可以使用许多其他方法在视频上进行渲染:

There are however a number of other approaches you can use to render on top of the video:

  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/OverlayTest.java

我认为 #4 虽然不理想,但可能是您能做的最好的,并且最接近您的要求.

I think #4, whilst not ideal, is probably the best you can do and is closest to what you're asking for.

这篇关于vlcj JPanel 在 mediaPlayerComponent 上绘制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆