gpt4 book ai didi

java - 如何有效地在 Java 中渲染视频(AWT??)

转载 作者:行者123 更新时间:2023-11-30 09:53:17 34 4
gpt4 key购买 nike

在我的项目中,我有一个 FrameProducer 类,每次创建视频帧时都会触发事件。每帧都是作为 java.awt.Image.BufferedImage 对象返回的图像。

我有 2 个 FrameProducer 对象,我想在屏幕上同时渲染它们生成的 BufferedImage's。我希望屏幕上呈现的图片可缩放(也就是说,当我拖动应用程序窗口的角时,呈现的视频会变小或变大)。

您认为如何最好地实现这一目标?

我考虑过使用 java.awt.Graphics2D 嵌入到 java.awt.Frame 中,但我不知道如何做这样的事情,或者如果这是最好的选择。我只需要它来进行算法可视化,它不需要漂亮 Shiny ,只需快速简单即可。我可以使用哪些建议或现成的代码?


编辑:好的,我按照 Rekin 的建议实现了解决方案,并且有效。但是因为我不是 Java 专家而且绝对不是 Swing专家,我想请您对我的代码发表友好的评论 - 我相信将来会有很多人从中受益。

正如我所说,有一个 FrameProducer(不用管实现):

public abstract class FrameProducer extends Observable {
public abstract BufferedImage getFrame();

public void fireEvent() {
setChanged();
notifyObservers();
}
}

然后还有一个 FrameRenderer 等待来自 FrameProducer 的事件(使用 java.util 的简单观察者模式实现):

public class FrameRenderer extends JPanel implements Observer {
private BufferedImage frame;
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(frame, null, 0, 0);
g2d.dispose();
}
@Override
public void update(Observable observable, Object arg) {
System.out.println("Cought an event from " + observable.getClass());
if (observable instanceof FrameProducer) {
frame = ((FrameProducer) observable).getFrame();
paint(getGraphics());
}
}
}

然后还有需要返工的东西:MainFrame

public class MainFrame extends JFrame {

FrameProducer[] producers;

public MainFrame(FrameProducer[] producers) {
this.setTitle("Playing what you feed.");
this.producers = producers;
initContents();
setVisible(true);
}

private void initContents() {
FrameRenderer renderer = new FrameRenderer();
renderer.setLocation(0, 0);
this.add(renderer);
producers[0].addObserver(renderer);
}
}

这一切都在 main 方法中初始化:

public class FrameAccessTest {
public static void main(String[] args) {
final FrameProducer frameGrabber = new CameraFrameGrabber("vfw://0");

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
MainFrame mainFrame =
new MainFrame(new FrameProducer[] {frameGrabber});
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}

我如何以这样的方式实现 initContents(),使 MainFrame 的 构造函数中作为 FrameProducer[] 提供的所有视频流连续呈现并且它们是可扩展的?

最佳答案

我会选择 JPanel 并覆盖 paintComponent 方法。在其中,我将使用 Graphics2D.drawImage() 将容器的宽度和高度作为参数提供给它。

AWT 方法似乎更接近裸机,但由于 JDK 6 对 Swing 渲染管道进行了大量改进,我会选择 Swing 和 Java2D 方法。它由可用硬件加速(尽可能在 Windows 或 OpenGL 上使用 DirectDraw),并在漂亮的 API 后面隐藏了许多低级细节。例如,您可以免费获得双缓冲。

关于java - 如何有效地在 Java 中渲染视频(AWT??),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3906105/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com