我需要从Camera对象获得至少每秒15帧的原始预览数据,但我只能在110毫秒内获得一帧,这意味着我每秒只能获得9帧.我在下面简要介绍一下代码
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();
Run Code Online (Sandbox Code Playgroud)
在上面的简要代码中,dataBufferSize和videoCaptureViewHolder是在其他语句中定义和计算或分配的.
我运行我的代码,我可以看到屏幕上的预览,我得到下面的日志:
...
V/CameraTest( 5396): Time Gap = 105
V/CameraTest( 5396): Time Gap = 112
V/CameraTest( …Run Code Online (Sandbox Code Playgroud) 我已经设法通过自定义滤镜(灰度,色调等)工作来获得相机预览.此自定义过滤器通过操作RGB数组然后将其绘制回画布然后在曲面视图中显示来应用预览回调.
这样做的缺点是我的FPS非常低.有了这个低FPS,如果我不使用Asynctask在后台线程中执行此操作,它在UI线程中做了太多工作.所以我尝试使用Asynctask进行相机操作(我的主要目的是让UI仍然能够完美地工作,即使是相机预览回调的繁重工作).
但即使在我使用Asynctask后,它也没有多大帮助.所以我想知道我的实现是错误的还是因为即使使用asynctask,UI线程仍会受到影响?
我的代码片段如下:
CameraActivity.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("ACTIVITY_LIFECYCLE","CameraActivity: onCreate");
setContentView(R.layout.camera_layout);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onResume() {
Log.d("ACTIVITY_LIFECYCLE","CameraActivity: onResume");
if(preview == null){
preview = new CameraPreviewAsync(this,camera);
preview.execute();
}
super.onResume();
}
@Override
protected void onPause() {
Log.d("ACTIVITY_LIFECYCLE","CameraActivity: onPause");
if(preview!=null){
preview.cancel(true);
camera = preview.getCamera();
if(camera!=null){
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
preview.setCamera(camera);
}
preview = null;
}
super.onPause();
}
@Override
public void onDestroy(){
Log.d("ACTIVITY_LIFECYCLE","CameraActivity: onDestroy");
super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)
CameraPreviewAsync.java:
private final String TAG = "CameraPreviewAsync";
private CameraActivity camAct;
private …Run Code Online (Sandbox Code Playgroud)