vlcj JPanel 绘制 mediaPlayerComponent
vlcj JPanel draw over mediaPlayerComponent
我有一个功能齐全的基于 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 后出现此错误:并且没有显示任何视频。
[0000000029d930e0] avi demux error: no key frame set for track 0
[0000000029e035d0] core vout display error: Failed to set on top
您根本无法使用 Java2D 在重量级 AWT Canvas
视频表面上绘制。
但是,您可以使用许多其他方法在视频之上进行渲染:
- 使用原生选取框 API - 这仅限于文本渲染。
- 使用本机徽标 API - 当然这仅限于渲染位图图像,而不是绘制矩形等图元。
- 使用 'direct' 媒体播放器 - 这里您自己渲染视频,您可以使用 Java2D 在视频之上渲染。而直接渲染媒体播放器对性能的要求更高
- 在视频表面上覆盖一个透明的顶层 Window 并以通常的方式使用 Java2D 渲染到该表面。这并不理想,因为您必须使叠加层 window 与视频表面位置和大小保持同步,这样做可能会滞后。 vlcj 有一个 API 可以帮助解决这个问题,还有一个示例应用程序可以演示它:https://github.com/caprica/vlcj/blob/d4c6dd5a0cb9f617fe236ea55fcf21b3fea588e8/src/test/java/uk/co/caprica/vlcj/test/overlay/OverlayTest.java
我认为 #4 虽然不理想,但可能是您能做的最好的,并且最接近您的要求。
我有一个功能齐全的基于 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 后出现此错误:并且没有显示任何视频。
[0000000029d930e0] avi demux error: no key frame set for track 0
[0000000029e035d0] core vout display error: Failed to set on top
您根本无法使用 Java2D 在重量级 AWT Canvas
视频表面上绘制。
但是,您可以使用许多其他方法在视频之上进行渲染:
- 使用原生选取框 API - 这仅限于文本渲染。
- 使用本机徽标 API - 当然这仅限于渲染位图图像,而不是绘制矩形等图元。
- 使用 'direct' 媒体播放器 - 这里您自己渲染视频,您可以使用 Java2D 在视频之上渲染。而直接渲染媒体播放器对性能的要求更高
- 在视频表面上覆盖一个透明的顶层 Window 并以通常的方式使用 Java2D 渲染到该表面。这并不理想,因为您必须使叠加层 window 与视频表面位置和大小保持同步,这样做可能会滞后。 vlcj 有一个 API 可以帮助解决这个问题,还有一个示例应用程序可以演示它:https://github.com/caprica/vlcj/blob/d4c6dd5a0cb9f617fe236ea55fcf21b3fea588e8/src/test/java/uk/co/caprica/vlcj/test/overlay/OverlayTest.java
我认为 #4 虽然不理想,但可能是您能做的最好的,并且最接近您的要求。