O programinha abaixo já te permite brincar de fazer um codec VNC.
Ele te fala quantos pixels estão mudando conforme vc brinca com a tela.
Se alguem fizer um codec de brincadeira, tipo um MPEG da vida e quiser me doar eu aceito. 
O objetivo e compremir esses bytes que estão mudando para eu poder jogar isso na rede.
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class ScreenVideo extends JPanel implements Runnable {
private int x, y, w, h;
private float fps;
private Robot robot;
private Rectangle rect;
private Thread thread;
private volatile boolean bThread;
private int sleeptime;
private Dimension size;
private int [] imageBytes;
private int [] lastFrame;
public ScreenVideo(int x, int y, int w, int h, float fps) throws AWTException {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.fps = fps;
this.rect = new Rectangle(x, y, w, h);
this.size = new Dimension(w, h);
this.robot = new Robot();
this.sleeptime = (int) ((1 / fps) * 1000);
this.imageBytes = new int[w * h];
this.lastFrame = new int[w * h];
}
public void start() {
startThread();
}
public void stop() {
stopThread();
}
public Dimension getPreferredSize() {
return size;
}
private void startThread() {
bThread = true;
thread = new Thread(this);
thread.start();
}
private void stopThread() {
bThread = false;
thread.interrupt();
thread = null;
}
public void run() {
try {
while(bThread) {
BufferedImage bi = robot.createScreenCapture(rect);
Graphics g = getGraphics();
g.drawImage(bi, 0, 0, this);
// veja o que mudou...
bi.getRGB(0, 0, w, h, imageBytes, 0, w);
int changed = 0;
for(int i=0;i<imageBytes.length;i++) {
if (imageBytes[i] != lastFrame[i]) {
changed++;
lastFrame[i] = imageBytes[i];
}
}
System.out.println("Mudou: " + changed);
Thread.sleep(sleeptime);
}
} catch(InterruptedException e) {
// bye
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String [] args) throws Exception {
JFrame frame = new JFrame("Minha Tela");
final ScreenVideo sv = new ScreenVideo(0, 0, 1024, 768, 1);
frame.setContentPane(sv);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
sv.stop();
System.exit(0);
}
});
frame.pack();
sv.start();
frame.setVisible(true);
}
}
>