Java ImageIO写入太慢

问题描述

我正在用Java编写客户端-服务器应用程序,其中客户端不断获取屏幕截图,并使用套接字将其发送到服务器。服务器会在这些图像出现时显示它们,因此它是一种视频流软件。

我的问题是显示的视频不是很流畅。我发现这是由于使用ImageIO ImageWriter write()方法将BufferedImages转换为JPEG格式所致。我制作了一个测试类,它通过拍摄200张屏幕截图然后将其转换来测试此转换的性能

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Main {

    public static void main(String[] args) throws IOException,InterruptedException {

        new Conversiontest().test(200);
    }

    public static class ConversionTest {

        private BlockingQueue<byte[]> convertedImages = new LinkedBlockingQueue<>();
        private BlockingQueue<BufferedImage> screenshots = new LinkedBlockingQueue<>();

        public void test(int numOfScreenshots) throws IOException,InterruptedException {
            Robot robot;
            try {
                robot = new Robot();
            } catch (AWTException e) {
                e.printstacktrace();
                return;
            }

            Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
            Rectangle shotArea = new Rectangle(defaultToolkit.getScreenSize());
            for (int i = 0; i < numOfScreenshots; i++) {
                BufferedImage screenCapture = robot.createScreenCapture(shotArea);
                screenshots.add(screenCapture);
            }
            System.out.println(screenshots.size());
            
            
            ImageWriter writer =
                    ImageIO.getimageWritersByFormatName("jpeg").next();
            long timeBefore = System.nanoTime();
            for (int i = 0; i < numOfScreenshots; i++) {
                BufferedImage screenshot = screenshots.take();
                ByteArrayOutputStream bout = new ByteArrayOutputStream();
                writer.setoutput(new MemoryCacheImageOutputStream(bout));
                writer.write(new IIOImage(screenshot,null,null));
                bout.flush();
                convertedImages.add(bout.toByteArray());
            }
            long timeAfter = System.nanoTime();
            writer.dispose();
            double totalTime = (timeAfter - timeBefore) / 1000000.0 / 1000.0;
            System.out.println(numOfScreenshots + " screenshots: " + totalTime + " sec");
            System.out.println(numOfScreenshots / totalTime + " of screenshots per second.");
        }
    }
}

在我的机器上运行此代码后的输出是:

200 screenshots: 11.331018700000001 sec
17.650663660099685 of screenshots per second.

是否可以提高此经过测试的代码片段的性能?如果是这样,我该如何实现呢?我想将每秒的屏幕截图数量增加到大约30或更多。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...