Estoy trabajando en un proyecto de juguete de administración remota. Por ahora, puedo capturar capturas de pantalla y controlar el mouse usando la clase Robot
. Las capturas de pantalla son BufferedImage
instancias.Alternativas para generar un video de capturas de pantalla
Primero de todos mis requisitos: - Solo un servidor y un cliente. - El rendimiento es importante, ya que el cliente puede ser una aplicación de Android.
He pensado en abrir dos conexiones de socket, una para los comandos del sistema y del mouse y la segunda para la alimentación de video.
¿Cómo podría convertir las capturas de pantalla a una transmisión de video? ¿Debería convertirlos a un formato de video conocido o estaría bien simplemente enviar una serie de imágenes serializadas?
La compresión es otro problema. Enviar las capturas de pantalla en resolución completa daría como resultado una baja velocidad de cuadro, de acuerdo con mis pruebas preliminares. Creo que necesito al menos 24 fps para percibir el movimiento, por lo que tengo que reducir y comprimir. Podría convertir el BufferedImages
en archivos jpg y luego establecer la tasa de compresión, pero no quiero almacenar los archivos en el disco, sino que deben vivir solo en la memoria RAM. Otra posibilidad sería serializar instancias (que representan una captura de pantalla sin comprimir) a un GZipOutputStream. ¿Cuál es el enfoque correcto para esto?
En resumen:
- En caso de que recomiendan la "serie de imágenes", enfoque, ¿cómo los serializar a la toma
OutputStream
? - Si su proposición es convertir a un formato de video saber, ¿qué clases o bibliotecas están disponibles?
Gracias de antemano.
ACTUALIZACIÓN: mis pruebas, cliente y servidor en la misma máquina
-Images Buffered serializadas en pantalla completa (solo dimensión, tipo e int []), sin compresión: 1.9 fps.
-fáciles imágenes de pantalla a través de las transmisiones GZip: 2.6 fps.
-Imagenes de escala de colores (ancho 640) y flujos GZip: 6,56 fps.
-Imagen de pantalla completa y codificación RLE: 4.14 fps.
-Imagen de escala de colores y codificación RLE: 7.29 fps.
Si utiliza su idea con imágenes comprimidas JPEG, no hay necesidad de crear archivos en absoluto: ImageIO funciona con transmisiones, por lo que puede "guardar" su imagen directamente en un socket y recuperarla en el otro extremo directamente como imagen también (con un pequeño código de cableado alrededor). – Durandal
@Durandal ¿Crees que ahorrará más espacio que las transmisiones GZip? –
Con JPEG tiene la opción (relación de compresión), si establece la calidad lo suficientemente baja ... comprimirá más que BufferedImage + GZIP. La pregunta es: cuánta calidad va a necesitar y qué tan rápido será con esa calidad (CPU y rendimiento de red requerido). A menos que tenga un rendimiento claro y objetivos de calidad, tendrá dificultades para decidir qué usar. – Durandal