相关疑难解决方法(0)

如何在Android中以至少每秒15帧的速度从Camera对象获取原始预览数据?

我需要从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)

camera android preview

30
推荐指数
2
解决办法
3万
查看次数

Android:具有预览回调功能的Camera Asynctask

我已经设法通过自定义滤镜(灰度,色调等)工作来获得相机预览.此自定义过滤器通过操作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)

camera android surfaceview android-camera android-asynctask

4
推荐指数
1
解决办法
1万
查看次数