Я пишу модуль захвата экрана на Java, но у меня возникают серьезные проблемы с производительностью при записи снимков экрана на диск.Что еще я могу сделать?
-
23-08-2019 - |
Вопрос
Я пишу модуль захвата экрана, используя класс Robot.Я делаю скриншоты приложения каждые x миллисекунд и записываю их на диск.После завершения захвата экрана я компилирую скриншоты в видео с помощью FFMPEG.
Однако запись изображений на диск происходит очень медленно и приводит к остановке моего приложения.Что мне не хватает?Есть ли лучший способ написать простой модуль захвата экрана?
Редактировать:Я пробовал несколько способов записи образов на диск, и все они очень медленные.Из-за простоты использования я остановился на следующем:
ImageIO.write(bufferedImage ,"jpg", file);
Решение
Или закодируйте изображение в видеоформат сразу при его съемке и вообще избегайте записи большого временного файла.Полный код использования Xuggler можно найти здесь:
Другие советы
Попробуйте поместить запись в новый поток, чтобы вам не приходилось ждать медленного ввода-вывода на диск.
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.schedule(new Runnable(){
@Override
public void run() {
writeImageHere(bufferedImage, file);
}
}
Просто следите за проблемами параллелизма.
Второе решение (интенсивно использующее память) — буферизовать ваши файлы JPG, хранить их все в памяти и записывать только по прошествии определенного времени или по завершении работы программы.
Буферизованное изображение по умолчанию довольно велико.Попробуйте использовать его в меньшем формате, а затем запишите.
Раньше я использовал .png, и он достаточно маленький.
Опубликуйте еще немного кода и посмотрите, что еще может быть не так в вашем.
РЕДАКТИРОВАТЬ
Я использую это:
BufferedImage bufferedImage = new BufferedImage(
widthFromRobot,
heightFromRobot,
BufferedImage. TYPE_3BYTE_BGR );
bufferedImage.getGraphics().drawImage( fromRobotScreenCapture, 0,0, null );
// get a file name
ImageIO.write( bufferedImage, "png", someFile );
Создайте новое изображение с тем же ширина и высота но другой типы изображений.
Запишите изображение в этом новом образе и сохраните это новое изображение на диск.
Изучите различные значения типов изображений и решите, какой из них лучше для вас.Конечно, может быть компромисс между качеством и скоростью.(Однако я думаю, что ваша проблема где-то в другом месте, но сначала попробуйте это)
Посмотрите ответ 6 из этого размещение.Это означает, что использование JAI улучшит производительность записи.