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;
       }
   }

Odpovedet emailem