Я работаю в игрушечном проекте по удаленному администрированию. Пока что я могу делать скриншоты и управлять мышью с помощью класса Robot
. Скриншоты являются экземплярами BufferedImage
.
Прежде всего, мои требования: - Только сервер и клиент. - Производительность важна, так как клиент может быть приложением для Android.
Я думал открыть два сокетных соединения, одно для мыши и системных команд, а второе для видео.
Как я могу преобразовать скриншоты в видеопоток? Должен ли я конвертировать их в известный видеоформат или можно просто отправлять серию последовательных изображений?
Сжатие - еще одна проблема. Отправка снимков экрана в полном разрешении приведет к низкой частоте кадров, согласно моим предварительным тестам. Я думаю, что для восприятия движения мне нужно не менее 24 кадров в секунду, поэтому придется и уменьшать масштаб, и сжимать. Я мог бы преобразовать BufferedImages
в файлы jpg и затем установить степень сжатия, но я не хочу хранить файлы на диске, они должны жить только в оперативной памяти. Другой возможностью было бы сериализовать экземпляры (представляющие несжатый снимок экрана) в GZipOutputStream. Каков правильный подход для этого?
Подведем итоги:
OutputStream
?Заранее спасибо.
UPDATE: мои тесты, клиент и сервер на одной машине
-Полный экран сериализованных BufferedImages (только dimension, type и int[]), без сжатия: 1.9 fps.
-полноэкранные изображения через GZip-потоки: 2.6 fps.
-уменьшенные изображения (ширина 640) и потоки GZip: 6.56 fps.
-Полноэкранные изображения и кодирование RLE: 4,14 кадров в секунду.
-Уменьшенные изображения и кодирование RLE: 7,29 кадров в секунду.