在Java Swing中渲染高清视频?太慢了?

时间:2010-12-08 03:43:49

标签: java swing video video-streaming

我想为我的Java Swing应用程序启用高清视频播放,但我担心可扩展性和明显缺乏直接屏幕写入访问权限。我有一个本机C ++库,它将进行编码和解码(h.264)我将通过JNI访问这个库,它将返回一个int [],我将渲染到屏幕。

到目前为止,通过JNI,编码/解码性能非常好。但是,我担心渲染开销。我想同时打开多个视频渲染,所以我想确保我以最有效的方式做事。

这是使用Java / Swing呈现视频的最有效方式吗?有什么方法可以直接写到屏幕而不必通过Java绘图系统吗?

这是我的代码的样子: ` 公共类VideoDisplay扩展了JLabel {

BufferedImage m_bufferedImage = null;


public VideoDisplay(Dimension frameSize) {
    // If there is nothing to show, make sure the widget is black.
    setBackground(Color.black);

    m_bufferedImage = new BufferedImage(frameSize.width, frameSize.height,
            BufferedImage.TYPE_INT_ARGB);

    ImageIcon frameIcon = new ImageIcon(m_bufferedImage);
    setIcon(frameIcon );

}

public void displayNewFrame(int[] newPixels, Dimension imageSize) {
    m_bufferedImage.setRGB(0, 0, imageSize.width, imageSize.height,
            newPixels, 0, imageSize.width);
    repaint();

}

}`

现在,我在24FPS上显示720p视频的开销似乎是Core2 Quad 6600 CPU上CPU的6%左右。

有没有更快的方法呢?

2 个答案:

答案 0 :(得分:2)

DJ Native Swing项目有一个win32媒体播放器和VLC播放器,可以嵌入Swing:http://djproject.sourceforge.net/ns

答案 1 :(得分:1)

你应该完全绕过Java并使用表面,或者将数据放在直接缓冲区和易失性图像中。

编辑:看起来你可能无法轻易完成后者。无论如何,通过直接字节缓冲区通过JNI传输图像数据。您可以在C中获得缓冲区指针。