Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to get raw preview data from Camera object at least 15 frames per second in Android?
    primarykey
    data
    text
    <p>I need to obtain raw preview data from Camera object at least <strong>15 frame per second</strong>, but I can only get a frame in 110 milliseconds which means I can get only 9 frames per second. I brief my code below.</p> <pre><code>Camera mCamera = Camera.open(); Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewFrameRate(30); parameters.setPreviewFpsRange(15000,30000); mCamera.setParameters(parameters); mCamera.addCallbackBuffer(new byte[dataBufferSize]); //dataBufferSize stands for the byte size for a picture frame mCamera.addCallbackBuffer(new byte[dataBufferSize]); mCamera.addCallbackBuffer(new byte[dataBufferSize]); mCamera.setPreviewDisplay(videoCaptureViewHolder); //videoCaptureViewHolder is a SurfaceHolder object mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { private long timestamp=0; public synchronized void onPreviewFrame(byte[] data, Camera camera) { Log.v("CameraTest","Time Gap = "+(System.currentTimeMillis()-timestamp)); timestamp=System.currentTimeMillis(); //do picture data process camera.addCallbackBuffer(data); return; } } mCamera.startPreview(); </code></pre> <p>In the briefed code above, dataBufferSize and videoCaptureViewHolder is defined and calculated or assigned in other statements.</p> <p>I run my code, I can see preview on the screen and I get the log below:</p> <pre><code>... V/CameraTest( 5396): Time Gap = 105 V/CameraTest( 5396): Time Gap = 112 V/CameraTest( 5396): Time Gap = 113 V/CameraTest( 5396): Time Gap = 115 V/CameraTest( 5396): Time Gap = 116 V/CameraTest( 5396): Time Gap = 113 V/CameraTest( 5396): Time Gap = 115 ... </code></pre> <p>This means <strong>onPreviewFrame(byte[] data, Camera camera)</strong> is called every 110 milliseconds so I can get no more than 9 frames per second. And no matter what preview frame rate I set by issue <strong>setPreviewFrameRate()</strong> and what preview Fps range I set by issue <strong>setPreviewFpsRange()</strong>, the log is the same.</p> <p>Would some one give me some help on this problem? I need to obtain raw preview data from Camera object at least 15 frames per second. Thank you in advance.</p> <p>I put my entire code below.</p> <p>CameraTest.java</p> <pre><code>package test.cameratest; import java.io.IOException; import java.util.Iterator; import java.util.List; import android.app.Activity; import android.graphics.ImageFormat; import android.hardware.Camera; import android.hardware.Camera.ErrorCallback; import android.hardware.Camera.Parameters; import android.hardware.Camera.Size; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; public class CameraTestActivity extends Activity { SurfaceView mVideoCaptureView; Camera mCamera; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mVideoCaptureView = (SurfaceView) findViewById(R.id.video_capture_surface); SurfaceHolder videoCaptureViewHolder = mVideoCaptureView.getHolder(); videoCaptureViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); videoCaptureViewHolder.addCallback(new Callback() { public void surfaceDestroyed(SurfaceHolder holder) { } public void surfaceCreated(SurfaceHolder holder) { startVideo(); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); } private void startVideo() { SurfaceHolder videoCaptureViewHolder = null; try { mCamera = Camera.open(); } catch (RuntimeException e) { Log.e("CameraTest", "Camera Open filed"); return; } mCamera.setErrorCallback(new ErrorCallback() { public void onError(int error, Camera camera) { } }); Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewFrameRate(30); parameters.setPreviewFpsRange(15000,30000); List&lt;int[]&gt; supportedPreviewFps=parameters.getSupportedPreviewFpsRange(); Iterator&lt;int[]&gt; supportedPreviewFpsIterator=supportedPreviewFps.iterator(); while(supportedPreviewFpsIterator.hasNext()){ int[] tmpRate=supportedPreviewFpsIterator.next(); StringBuffer sb=new StringBuffer(); sb.append("supportedPreviewRate: "); for(int i=tmpRate.length,j=0;j&lt;i;j++){ sb.append(tmpRate[j]+", "); } Log.v("CameraTest",sb.toString()); } List&lt;Size&gt; supportedPreviewSizes=parameters.getSupportedPreviewSizes(); Iterator&lt;Size&gt; supportedPreviewSizesIterator=supportedPreviewSizes.iterator(); while(supportedPreviewSizesIterator.hasNext()){ Size tmpSize=supportedPreviewSizesIterator.next(); Log.v("CameraTest","supportedPreviewSize.width = "+tmpSize.width+"supportedPreviewSize.height = "+tmpSize.height); } mCamera.setParameters(parameters); if (null != mVideoCaptureView) videoCaptureViewHolder = mVideoCaptureView.getHolder(); try { mCamera.setPreviewDisplay(videoCaptureViewHolder); } catch (Throwable t) { } Log.v("CameraTest","Camera PreviewFrameRate = "+mCamera.getParameters().getPreviewFrameRate()); Size previewSize=mCamera.getParameters().getPreviewSize(); int dataBufferSize=(int)(previewSize.height*previewSize.width* (ImageFormat.getBitsPerPixel(mCamera.getParameters().getPreviewFormat())/8.0)); mCamera.addCallbackBuffer(new byte[dataBufferSize]); mCamera.addCallbackBuffer(new byte[dataBufferSize]); mCamera.addCallbackBuffer(new byte[dataBufferSize]); mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { private long timestamp=0; public synchronized void onPreviewFrame(byte[] data, Camera camera) { Log.v("CameraTest","Time Gap = "+(System.currentTimeMillis()-timestamp)); timestamp=System.currentTimeMillis(); try{ camera.addCallbackBuffer(data); }catch (Exception e) { Log.e("CameraTest", "addCallbackBuffer error"); return; } return; } }); try { mCamera.startPreview(); } catch (Throwable e) { mCamera.release(); mCamera = null; return; } } private void stopVideo() { if(null==mCamera) return; try { mCamera.stopPreview(); mCamera.setPreviewDisplay(null); mCamera.setPreviewCallbackWithBuffer(null); mCamera.release(); } catch (IOException e) { e.printStackTrace(); return; } mCamera = null; } public void finish(){ stopVideo(); super.finish(); }; } </code></pre> <p>AndroidManifest.xml</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.cameratest" android:versionCode="1" android:versionName="1.0"&gt; &lt;uses-sdk android:minSdkVersion="9" android:targetSdkVersion="10" android:maxSdkVersion="10"/&gt; &lt;uses-permission android:name="android.permission.CAMERA" /&gt; &lt;uses-permission android:name="android.permission.INTERNET" /&gt; &lt;uses-permission android:name="android.permission.VIBRATE" /&gt; &lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&gt; &lt;uses-permission android:name="android.permission.WAKE_LOCK" /&gt; &lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt; &lt;uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/&gt; &lt;uses-permission android:name="android.permission.READ_CONTACTS"/&gt; &lt;uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/&gt; &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&gt; &lt;uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/&gt; &lt;uses-permission android:name="android.permission.CALL_PHONE"/&gt; &lt;uses-permission android:name="android.permission.BOOT_COMPLETED"/&gt; &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&gt; &lt;uses-permission android:name="android.permission.WRITE_SETTINGS" /&gt; &lt;application android:icon="@drawable/icon" android:label="@string/app_name"&gt; &lt;activity android:name=".CameraTestActivity" android:label="@string/app_name"&gt; &lt;intent-filter&gt; &lt;action android:name="android.intent.action.MAIN" /&gt; &lt;category android:name="android.intent.category.LAUNCHER" /&gt; &lt;/intent-filter&gt; &lt;/activity&gt; &lt;/application&gt; &lt;/manifest&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    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.
 

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