Zdravim vsechny. Pisi program, kery potrebuje nacitat jednotlive snimky
z kamery a dale je zpracovavat. Nyni mam napsanou cast, ze jsem sice
schopen nacitat jednotlive snimky, ale chybi mi moznost odchytavat
udalost, ktera mi oznamuje, ze je novy snimek pripraven k pouziti.
Potrebuji aby mi toto JMF oznamil. Zatim muj kod vypada takto (viz
nize). Chci se zbavit vypocitavani pauzy v threadu, ktery cte snimky
(je to nepresne a stava se ze mam dva stejne snimky za sebou) a zmenit
to na cteni na zaklade udalosti oznamujici ze je novy snimek k
dispozici. Nemate nekdo zkusenost s timto? Vyuzivam JMF verze 2.1.1e a
JDK 6.0. Pokud znate nekdo jinou vhodnou knihovnu, tak se ozvete take.
Knihovna by mela fungovat pod Windowsy a Linuxem.
Diky Jaroslav Hurdes
inicializace:
MediaLocator locator = new MediaLocator("vfw://0");
player = Manager.createPlayer(locator);
player.addControllerListener(new
PlayerControllerListener());
player.realize();
while(player.getState() != Player.Realized) {
Thread.sleep(100);
}
spusteni:
player.start();
while(player.getState() != Player.Started) {
Threadsleep(100);
}
frameGrabber = (FrameGrabbingControl)
player.getControl(FrameGrabbingControl.class.getName());
if(frameGrabber != null) {
imagesReader = new ImagesReader();
imageReaderThread = new Thread(imagesReader);
imageReaderThread.start();
}
cteni jednotlivych snimku:
protected class ImagesReader implements Runnable {
protected volatile boolean stop;
public void stop() {
this.stop = true;
}
@Override
public void run() {
stop = false;
while(!stop) {
long processTime = System.currentTimeMillis();
Buffer buffer = frameGrabber.grabFrame();
actualFrame = getFrame(buffer);
if(actualFrame != null) {
framesQueue.put(actualFrame);
} else {
continue;
}
processTime = (System.currentTimeMillis() - processTime);
// Casovani pro ziskani dalsiho snimku
long delay = nextFrameDelay - processTime;
if(delay > 0) {
ThreadUtils.sleep(delay);
}
}
}
protected Frame getFrame(Buffer buffer) {
if(buffer.getData() == null) {
return null;
}
Frame frame = new Frame();
frame.setTimestamp(TimeUtils.getActualTimestamp());
frame.setImageWidth(((VideoFormat)buffer.getFormat()).getSize().width);
frame.setImageHeight(((VideoFormat)buffer.getFormat()).getSize().height);
frame.readFromRGB((byte[]) buffer.getData(), true);
return frame;
}
}