Frame Grabber pomoci Java Media Framework

Jaroslav Hurdes java na ataco.cz
Sobota Březen 7 22:59:42 CET 2009


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



Daląí informace o konferenci Konference