问题描述
我正在用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 (将#修改为@)