2017-03-15 1 views
0

En ImageReader.OnImageAvailableListener rappel, je viens d'utiliser SystemClock.elapsedRealtime() pour calculer l'intervalle de trame pour obtenir le fps, et il imprime ceci:Mesure images par seconde d'Android Camera2

fps = 27.777779 
fps = 34.482758 
fps = 27.777779 
fps = 32.258064 
fps = 14.285714 
fps = 35.714287 
fps = 30.30303 
fps = 17.54386 
fps = 125.0 

Ma question est, est-il vrai que le réel fps fluctue juste comme ça? Si c'est le cas, existe-t-il un moyen fiable de régler la fréquence d'images, disons que je n'ai besoin que d'une vitesse de 15 ou 20 images par seconde. Est-ce réalisable ou non?

ps: J'essayé d'utiliser

captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange); 

avec bestFPSRange = [30,30], mais il ne semble pas fonctionner.

Merci.

Répondre

0

Essayez d'utiliser YUV420 pour obtenir des données de ImageReader: -

ImageReader.newInstance(mWidth,mHeight ,ImageFormat.YUV_420_888, maxImages); 

Aussi, vérifiez votre mlargeur et mhauteur.

Vous pouvez essayer l'approche suivante pour mesurer ips: -

int frameCount=0; 
    long frameTime=0; 
    ImageReader.OnImageAvailableListener mImageAvailableRight=new ImageReader.OnImageAvailableListener() { 
     @Override 
     public void onImageAvailable(ImageReader imageReader) { 
      try{ 


       Object[] objects=initFPSNew("Measure fps is-->",frameTime,frameCount); 
       frameTime=(long)objects[0]; 
       frameCount=(int)objects[1]; 

       Image mImage=imageReader.acquireNextImage(); 
       if(mImage!=null){ 
        mImage.close(); 
       } 

      }catch (Exception exc) 
      { 
       exc.printStackTrace(); 
       Log.v(TAG,"Exception Camera2"+ exc.getMessage()); 
      } 

     } 
    }; 





public static Object[] initFPSNew(String message,long startTime,int counter){ 

     Object[] mObjectTime=new Object[2]; 
     if(startTime==0){ 

      startTime=System.currentTimeMillis(); 
      mObjectTime[0]=startTime; 
      counter+=1; 
      mObjectTime[1]=counter; 
     }else{ 
      long difference=System.currentTimeMillis()-startTime; 
      //We wil check count only after 1 second laps 
      double seconds = difference/1000.0; 

      if(seconds>=1) 
      { 
       Log.v(TAGFPS,message+ counter); 
       counter=0; 
       mObjectTime[0]=System.currentTimeMillis(); 
       mObjectTime[1]=counter; 

      }else{ 
       counter++; 
       mObjectTime[0]=startTime; 
       mObjectTime[1]=counter; 
      } 

     } 
     return mObjectTime; 
    }