Note that there are some explanatory texts on larger screens.

plurals
  1. POImage preview is very slow on Nexus4
    primarykey
    data
    text
    <p>I need to increase fps rate in my app. Now i have between 6 - 10 FPS which is very low imo because i have Nexus4. So i decided to switch from setPreviewCallback to setPreviewCallbackWithBuffer but i do not see ANY difference in framerate. In log i can see that addressess of buffers are changing circular but still i have only 6 - 10 fps (sometimes 12 but rarely)... Could you try to give me some advices? BTW. I have Android 4.4 and i tried OpenCV but there result is almost the same... My code is: </p> <pre><code>public class XPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback { private SurfaceHolder mHolder; private Camera mCamera; long mTimer = 0; public XPreview(Context context, Camera camera) { super(context); mCamera = camera; mHolder = getHolder(); mHolder.addCallback(this); } public void surfaceCreated(SurfaceHolder holder) { } public void surfaceDestroyed(SurfaceHolder holder) { } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { if (mHolder.getSurface() == null){ // preview surface does not exist return; } // stop preview before making changes try { mCamera.stopPreview(); } catch (Exception e){ // ignore: tried to stop a non-existent preview } try { int formatt = mCamera.getParameters().getPreviewFormat(); int bytesPerPx = ImageFormat.getBitsPerPixel( formatt ); int width = mCamera.getParameters().getPreviewSize().width; int height = mCamera.getParameters().getPreviewSize().height; int size = (int)( ( width * height * bytesPerPx ) / 8.0); Parameters params = mCamera.getParameters(); mCamera.setParameters(params); Log.d(TAG, "Data: " + formatt + " " + bytesPerPx + " " + width + "x" + height + " " + size ); mCamera.setPreviewDisplay(mHolder); mCamera.setPreviewCallbackWithBuffer(this); mCamera.addCallbackBuffer( new byte[size] ); mCamera.addCallbackBuffer( new byte[size] ); mCamera.addCallbackBuffer( new byte[size] ); mCamera.addCallbackBuffer( new byte[size] ); mCamera.addCallbackBuffer( new byte[size] ); mCamera.startPreview(); } catch (Exception e){ Log.d(TAG, "Error starting camera preview: " + e.getMessage()); } } @Override public void onPreviewFrame(byte[] data, Camera camera) { long time = System.currentTimeMillis(); Log.d( TAG, "Time between frames: " + ( time - mTimer ) + "ms, FPS: " + ( 1000.0 / (time - mTimer )) + ", data " + data ); mTimer = time; camera.addCallbackBuffer(data); } } </code></pre> <p>Activity:</p> <pre><code>public class RTP extends Activity { private Camera mCamera; private XPreview mPreview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mCamera = Camera.open(); mPreview = new XPreview(this, mCamera); FrameLayout preview = (FrameLayout) findViewById( R.id.frameLayout1 ); preview.addView(mPreview); } @Override public void onPause(){ super.onPause(); if( mCamera != null ){ mCamera.stopPreview(); mCamera.release(); mCamera = null; } } } </code></pre> <p>Edit:</p> <pre><code>Parameters params = mCamera.getParameters(); params.setRecordingHint(true); mCamera.setParameters(params); </code></pre> <p>This decreased delay between frames to about ~30ms with version with buffers and decresed delay to about 60 with version without buffer. Anyway i'd be glad if someone could give me some more advices. <br><br>A bit deeper tests shows that now i have between 24 and 31 fps using version with buffering and two buffers and between 15 and 22 using default version.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload