Я пишу модуль захвата экрана на Java, но у меня возникают серьезные проблемы с производительностью при записи снимков экрана на диск.Что еще я могу сделать?

StackOverflow https://stackoverflow.com/questions/1087891

Вопрос

Я пишу модуль захвата экрана, используя класс Robot.Я делаю скриншоты приложения каждые x миллисекунд и записываю их на диск.После завершения захвата экрана я компилирую скриншоты в видео с помощью FFMPEG.

Однако запись изображений на диск происходит очень медленно и приводит к остановке моего приложения.Что мне не хватает?Есть ли лучший способ написать простой модуль захвата экрана?

Редактировать:Я пробовал несколько способов записи образов на диск, и все они очень медленные.Из-за простоты использования я остановился на следующем:

ImageIO.write(bufferedImage ,"jpg", file);
Это было полезно?

Решение

Или закодируйте изображение в видеоформат сразу при его съемке и вообще избегайте записи большого временного файла.Полный код использования Xuggler можно найти здесь:

Демонстрационный код захвата экрана 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 улучшит производительность записи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top