zoukankan      html  css  js  c++  java
  • surfaceView和Camera配合进行摄像头的预览

    首先是Camera类,在5.0上已经被废弃,不推荐使用但还是支持的。最新的是Camera2类,我还没有研究,据说用法完全不一样,反正也是一个坑跳入另外一个坑。
    上面是简介和需要的权限,记得加上权限。
    步骤在下面图里:
    说了大体的流程去使用这个类,三个标important的条目,按照步骤走就好。需要注意的就是第5条,Pass a fully initialized SurfaceHolder,需要一个已经完全初始化完毕的surface,也就是你需要等surface初始化完毕之后才能调用setPreviewDisplay(SurfaceHolder)
    所以最好把openCamera的工作放到surfaceHolder的回调里面去:like here:
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    
    System.out.println("surfaceCreated");
    camera = Camera.open();
    }
    然后我们要做的是对Camera进行configure
    private void initCamera() {
    
    parameters = camera.getParameters();
    parameters.setFlashMode("off"); // 无闪光灯
    parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
    parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
    parameters.setPreviewFormat(ImageFormat.YV12);
    parameters.setPictureSize(camWidth, camHeight);
    parameters.setPreviewSize(camWidth, camHeight);
    //这两个属性 如果这两个属性设置的和真实手机的不一样时,就会报错
    camera.setParameters(parameters);
    // 横竖屏镜头自动调整
    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
    parameters.set("orientation", "portrait"); //
    parameters.set("rotation", 90); // 镜头角度转90度(默认摄像头是横拍)
    camera.setDisplayOrientation(90); // 在2.2以上可以使用
    } else// 如果是横屏
    {
    parameters.set("orientation", "landscape"); //
    camera.setDisplayOrientation(0); // 在2.2以上可以使用
    }
    
    byte[] buf = new byte[camWidth * camHeight * 3 / 2];
    camera.addCallbackBuffer(buf);
    camera.setPreviewCallback(this);
    }
    这些东西我是在surfaceChanged里面调用开启的:
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
    System.out.println("surfaceChanged");
    initCamera();
    try {
    camera.setPreviewDisplay(holder);
    camera.startPreview();
    System.out.println("startPreview");
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    上面我们对camera做了初始化并设置了setPreviewCallback,所以我们对图像的处理或者视频的处理就可以在Camera.PreviewCallback它的回调
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
    
    if (data == null) {
    return;
    }
    System.out.println("onPreviewFrame");
    int ret = avcCodec.offerEncoder(data, h264);
    }
    里面做处理,之前设置了camera.setPreviewCallbackWithBuffer();
    结果onPreviewFrame只在open的时候调用一次,找了一天的原因。。。。。。。。。。。。才发现是这儿。 
    先这样,后续做encode再补充。
     
    github resp added.
    https://github.com/yocn/CameraPreview
  • 相关阅读:
    加密解密
    论事件驱动与异步IO
    linux 基础命令
    libgcc_s_dw2-1.dll 缺失问题解决
    TightVNC 远程桌面
    配置机器学习开发环境(eclipse + anaconda2)
    Caffe 执行python实例并可视化
    Caffe windows编译找不到python27_d.lib问题解决
    PHP 上传文件名中带中文的文件失败问题
    Windows 搭建PHP开发环境
  • 原文地址:https://www.cnblogs.com/Sharley/p/5595443.html
Copyright © 2011-2022 走看看