Android开启双摄像头

开启双目摄像头的需求大部分都会出现在人脸识别的设备上,所以这里的方法仅作为参考。

之前写过一篇双目摄像头的文章,但是说的非常笼统,重点的问题都没有提到,今天咱们就来好好说道说道

先在activity_main.xml里撸一个布局,两个SurfaceView用来分别显示两个摄像头获取的图像:




    
        
        

    


视频内容显示可以用SurfaceView或TextureView,这两个都可以进行视频画面帧的展示,他们的区别以后会说到,有兴趣的同学可以百度一下。简单来说,SurfaceView对内存上处理更好,TextureView支持移动、旋转、缩放等动画,以及截图操作。从性能和安全性角度出发,使用播放器的话优先选SurfaceView。但是显示摄像头图像会有需要镜像旋转等问题,所以我在实际使用的时候其实是用的TextureView。

首先就是需要在onCreate里绑定布局:

surfaceViewRed = findViewById(R.id.redsurface);
surfaceViewColor = findViewById(R.id.colorsurface);
surfaceHolderRed = surfaceViewRed.getHolder();
surfaceHolderColor = surfaceViewColor.getHolder();

//动态权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.CAMERA}, 1);
}
initRedCamera(); //0
initColorCamera(); //1

initXXXCamera方法里有每个摄像头的初始化和设置,例如initColorCamera()方法里:

public void initColorCamera() {
        colorCamera = Camera.open(1);
        colorCamera.setDisplayOrientation(270);

//      这里可以用来做获取预览帧数据的操作
//        Camera.Parameters parameters = colorCamera.getParameters();
//        final int w = parameters.getPreviewSize().width;
//        final int h = parameters.getPreviewSize().height;

//        colorCamera.setPreviewCallback(new Camera.PreviewCallback() {
//            @Override
//            public void onPreviewFrame(byte[] data, Camera camera) {
                PreviewImage.setColorPic(data, w, h);
//            }
//        });

//显示摄像头预览图像
        surfaceHolderColor.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                try {
                    colorCamera.setPreviewDisplay(holder);

                } catch (IOException e) {
                    e.printStackTrace();
                }
                colorCamera.startPreview();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });
    }

在这里可以看见不光有SurfaceView,还有SurfaceHolder。SurfaceHolder是一个接口,其作用就像一个关于Surface的监听器。提供访问和控制SurfaceView背后的Surface 相关的方法 ,它通过三个回调方法,让我们可以得到Surface的创建、销毁或者改变。在SurfaceView中有一个方法getHolder,可以很方便地获得SurfaceView所对应的Surface所对应的SurfaceHolder。

这样摄像头就可以打开并显示了,说是打开双摄其实就是分别打开两个摄像头,算是一种思路吧。

要是您觉得,还可以的话也请帮忙给个星呗,不胜感谢!

demo地址:https://github.com/YuGongCharley/twoCamerasDemo

你可能感兴趣的:(Android)