2012-10-13 6 views
0

J'ai utilisé javacv pour mon projet pour faire face à avi. La vidéo montre plus vite que la normale, je veux obtenir le fps pour définir la vitesse de la vidéo. Mais grabber.getFrameRate() renvoie 0, de même que grabber.getLengthInFrames() et grabber.getSampleRate(), quelqu'un peut-il me dire pourquoi? extrait de code ci-dessous:javacv: grabber.getFrameRate() return 0

FrameGrabber grabber = new OpenCVFrameGrabber("sample.avi"); 
double fps=grabber.getFrameRate(); 
System.out.println(fps); 
//int n=grabber.getLengthInFrames(); 
//int f=grabber.getSampleRate(); 
CvMemStorage storage = CvMemStorage.create(); 
grabber.start(); 
grabbedImage = grabber.grab(); 
while (frame.isVisible() && (grabbedImage = grabber.grab()) != null) 
{ 
     BufferedImage bfimg = grabbedImage.getBufferedImage();   
     frame.showImage(bfimg); 
     frame.waitKey((int)(1000/fps));    
     cvClearMemStorage(storage); 
} 
grabber.stop(); 
+1

Avez-vous essayé d'utiliser à la place 'FFmpegFrameGrabber'? –

Répondre

0

vous devez appeler après le début();

peut-être vous pouvez

FrameGrabber grabber = new OpenCVFrameGrabber("sample.avi"); 
grabber.start(); 
double fps=grabber.getFrameRate(); 
0

J'utiliser ce code pour enregistrer mp4 vidéo:

public static void main(String[] args) { 
    IplImage image; 
    CanvasFrame canvas = new CanvasFrame("Web Cam"); 
    try { 
     OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); 
     grabber.start(); 
     IplImage grabbedImage = grabber.grab(); 

     canvas.setCanvasSize(grabbedImage.width(), grabbedImage.height()); 

     System.out.println("framerate = " + grabber.getFrameRate()); 
     grabber.setFrameRate(grabber.getFrameRate()); 
     FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("c:/demo.mp4", 320, 240); 

     recorder.setVideoCodec(13); 
     recorder.setFormat("mp4"); 
     recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); 
     recorder.setFrameRate(10); 
     recorder.setVideoBitrate(5*1024); 


     recorder.start(); 
     System.out.println("framerate = " + grabber.getFrameRate()); 

     while (canvas.isVisible() && (grabbedImage = grabber.grab()) != null) { 
      canvas.showImage(grabbedImage); 
      recorder.record(grabbedImage); 
     } 


     recorder.stop(); 
     grabber.stop(); 
     canvas.dispose(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
0

J'ai essayé dans un exemple de webcam et cela a fonctionné:

double time1,time2; 

// your loop 

while(....){ 

    time1=System.currentTimeMillis(); // add this first in the loop 

     //code here 
      . 
      . 
      . 
      . 

    time2=System.currentTimeMillis(); // add this at the end of the loop 

System.out.println("framerate = " + 1/(((time2-time)/1000)%60)) 

} //end of loop 

En cas de l'exemple webcam avec le code pour la webcam trouvé: http://opencvlover.blogspot.com/2012/05/accessing-webcam-using-javacv.html

il ressemble à ceci:

IplImage img 
while (...) { 

    time1=System.currentTimeMillis(); // add this first in the loop 

    //inser grabed video fram to IplImage img 
    img = grabber.grab(); 

      . 
      . 
      . 
      . 
    //Show video frame in canvas 
    canvas.showImage(img); 

time2=System.currentTimeMillis(); // add this at the end of the loop 

System.out.println("framerate = " + 1/(((time2-time)/1000)%60)) 
} //end of loop 
      . 
      .    
      .