Sto lavorando a un progetto di giocattoli di amministrazione remota. Per ora, sono in grado di catturare schermate e controllare il mouse usando la classe Robot
. Le schermate sono istanze BufferedImage
.Alternative per la generazione di un feed video da screenshot
Prima di tutto, i miei requisiti: - Solo un server e un client. - Le prestazioni sono importanti, poiché il client potrebbe essere un'app Android.
Ho pensato di aprire due connessioni socket, una per i comandi del mouse e di sistema e la seconda per il feed video.
Come posso convertire gli screenshot in uno streaming video? Dovrei convertirli in un formato video conosciuto o sarebbe giusto inviare solo una serie di immagini serializzate?
La compressione è un altro problema. L'invio delle schermate catturate a piena risoluzione comporterebbe un basso frame rate, secondo i miei test preliminari. Penso di aver bisogno di almeno 24 fps per percepire il movimento, quindi devo effettuare il downscale e comprimerlo. Potrei convertire il file BufferedImages
in jpg e quindi impostare il tasso di compressione, ma non voglio archiviare i file sul disco, ma dovrebbero vivere solo nella RAM. Un'altra possibilità sarebbe quella di serializzare le istanze (che rappresentano uno screenshot non compresso) in un GZipOutputStream. Qual è l'approccio corretto per questo?
In sintesi:
- Nel caso in cui si consiglia la "serie di immagini" l'approccio, come sarebbe li serializzare alla presa
OutputStream
? - Se la tua proposta è quella di convertire in un formato video noto, quali classi o librerie sono disponibili?
Grazie in anticipo.
UPDATE: il mio test, client e server sulla stessa macchina
schermo Full BufferedImages serializzati (sola dimensione, tipo e int []), senza compressione: 1,9 fps.
-tutte le immagini dello schermo tramite stream GZip: 2.6 fps.
-Immagini scalate (larghezza 640) e flussi GZip: 6,56 fps.
- Immagini schermo intero e codifica RLE: 4,14 fps.
-Immagini scalate e codifica RLE: 7,29 fps.
Se si utilizza la propria idea con immagini compresse JPEG, non è necessario creare file - ImageIO funziona con flussi, quindi è possibile "salvare" l'immagine direttamente in un socket e recuperarla direttamente dall'altra parte come immagine pure (con un piccolo codice di cablaggio in giro). – Durandal
@Durandal Pensi che farà risparmiare più spazio rispetto ai flussi GZip? –
Con JPEG avete la scelta (rapporto di compressione), se avete impostato una qualità sufficientemente bassa ... comprimerà più di BufferedImage + GZIP. La domanda è: quanta qualità avrà bisogno e quanto velocemente sarà con quella qualità (CPU e troughput di rete richiesto). A meno che tu non abbia obiettivi chiari di prestazioni e qualità, avrai difficoltà a decidere cosa usare. – Durandal