繁体   English   中英

Android Camera2 API,随时随地快速交换相机

[英]Android Camera2 api, Swap cameras quickly on the go

我正在使用Camera2 API开发一个Android应用。

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

根据我的理解,您无法一次打开两个摄像机(我也尝试过),因此您必须先停止第一个摄像机再打开第二个摄像机。

问题是我花了1.5秒停止了第一台相机。

例如,手套如何在几百毫秒内设法更换相机?


我使用的代码是Google的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 Monitor:

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()回调正在运行


-更新2017年8月7日-

似乎camera2 api所需的关闭时间比旧的api更长。

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

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

这是您要做的:

  • 使用cameraManager.openCamera("1", ...)创建设备1(即后置摄像头cameraManager.openCamera("1", ...)
  • 创建设备2(即前置摄像头) cameraManager.openCamera("2", ...)
  • 为每个摄像机拥有CameraDevice实例后,开始其捕获会话
  • cameraDevice1.createCaptureSession(surface1, ...)
  • cameraDevice1.createCaptureSession(surface2, ...)
  • 成功创建捕获会话后,您应该在处调用captureSession.setRepeatingRequest(...)

正如您所注意到的,从“临时”切换摄像头会有巨大的开销。 如果您只想一次显示一个预览。 您仍然可以为每个摄像机调用openCamera()为每个摄像机调用createCaptureRequest ,并使用setRepeatingRequeststopRepeating来控制何时捕获stopRepeating实际在处理帧。

希望这可以帮助!

威廉·格德斯

这是您要做的:

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

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

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

监视器仅记录“ camera 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();
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM