Android Camera2 api,即时交换相机

时间:2017-08-01 13:22:27

标签: java android android-camera android-camera2

我正在使用Camera2 api制作Android应用。

我希望能够在前后摄像头之间切换,但无论我如何尝试实现它,都需要花费大量的时间。

根据我的理解,你不能同时打开两个摄像头(我也试过了),所以你必须在打开第二个之前停止第一个。

问题是我需要1.5秒才能停止第一台摄像机。

例如,Snapchat如何设法在几百毫秒内交换相机?

我使用的代码是来自谷歌的camera2basic,可以在这里找到:

https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java

我添加了一种停止相机的简单方法:

public void stopCamera(){
    Log.i("yoyo","Stopcamera() begin");
    mCameraDevice.close();
    //stopBackgroundThread();
    Log.i("yoyo","Stopcamera() end");
}

Android监视器:

08-01 15:13: 01.478 10020-10020 / com.example.android.camera2basic I / yoyo: Stopcamera()开始 08-01 15:13: 02.852 10020-10020 / com.example.android.camera2basic I / yoyo: Stopcamera()结束 08-01 15:13:02.853 10020-10020 / com.example.android.camera2basic I / Choreographer:跳过81帧!应用程序可能在其主线程上做了太多工作。 08-01 15:13:02.855 10020-10207 / com.example.android.camera2basic I / yoyo: Cameradevice - onClosed()回调运行

-UPDATE 07 aug 2017 -

看起来camera2 api的关闭时间比旧的相机api要长。

我尝试使用旧的相机api,我达到了与Snapchat / instagram相同的速度,所以我猜他们正在使用旧的相机api。

2 个答案:

答案 0 :(得分:0)

您应该能够同时运行两个捕获会话。你甚至可以同时拥有"预览"在UI上同时。

这是你要做的事情:

  • 使用cameraManager.openCamera("1", ...)
  • 创建设备1(即后置摄像头)
  • 创建设备2(即前置摄像头)cameraManager.openCamera("2", ...)
  • 为每个摄像头准备一个CameraDevice实例后,启动他们的捕获会话
  • cameraDevice1.createCaptureSession(surface1, ...)
  • cameraDevice1.createCaptureSession(surface2, ...)
  • 成功创建捕获会话后,您应该拨打captureSession.setRepeatingRequest(...)

正如您所注意到的那样,从#34;刮擦"切换相机会产生巨大的开销。如果您只想一次显示一个预览。您仍然可以为每个摄像头调用openCamera(),为每个摄像头调用createCaptureRequest,并使用setRepeatingRequeststopRepeating来控制captureSession实际处理帧的时间。

希望这有帮助!

答案 1 :(得分:0)

  

William Guedes

     

以下是您必须做的事情:

     

创建设备1(即后置摄像头)   cameraManager.openCamera(“1”,...)

     

创建设备2(即前置摄像头)cameraManager.openCamera(“2”,...)

我在下面写了一些简单的代码,用于使用manager.openCamera()打开两个摄像头。

虽然监视器只记录“摄像机0 onOpened()回调”,但我认为这样你只能打开一台摄像机吗?

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("yoyo", "onCreate() begin");
        CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

        try {

            String[] cameraIdList = manager.getCameraIdList();

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123);
                return;
            }
            manager.openCamera(cameraIdList[0], new CameraDevice.StateCallback() {
                @Override
                public void onOpened(@NonNull CameraDevice cameraDevice) {
                    Log.e("yoyo", "camera 0 onOpened() callback");
                }

                @Override
                public void onDisconnected(@NonNull CameraDevice cameraDevice) {

                }

                @Override
                public void onError(@NonNull CameraDevice cameraDevice, int i) {

                }
            }, null);

            manager.openCamera(cameraIdList[1], new CameraDevice.StateCallback() {
                @Override
                public void onOpened(@NonNull CameraDevice cameraDevice) {
                    Log.e("yoyo", "camera 1 onOpened() callback");
                }

                @Override
                public void onDisconnected(@NonNull CameraDevice cameraDevice) {

                }

                @Override
                public void onError(@NonNull CameraDevice cameraDevice, int i) {

                }
            }, null);


        }catch (CameraAccessException e) {e.printStackTrace();}


    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 123) {
            if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
                // close the app
                Toast.makeText(this, "Sorry!!!, you can't use this app without granting permission", Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }
}