Android Camera获取预览流

camera获取预览流的方法有两种:
方法1 直接显示setPreviewDisplay,方法2 使用previewCallback
第一种
1 需要一个surfaceview
2在权限允许和surfaceview onCreate 成功后,打开camera,并且把surfaceview的holder设置在camera的setDisplayPreview上。
3 为Camera设置一些Camera.Parameters,之后startPreview。
4 在onPause时stopPreview、releaseCamera,否则Camera被占用,其他程序无法使用相机。
具体代码分析如下:
在onCreate中获取surfaceView的holder并且添加当前的activity为回调函数。
SurfaceHolderholder=mSurfaceView.getHolder();//取得holder
holder.setFormat(PixelFormat.TRANSLUCENT);
holder.setKeepScreenOn(true);
holder.addCallback(this);//holder加入回调接口
在onPause中,初始化相机,主要是参数的设定。然后调用回调函数surfaceCreate。
当surfaceview发生变化时,调用回调函数surfaceChanged。
//设置显示
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();

在onPause()中完成释放相机的操作。

以上过程中,涉及到几个重要的概念:
surfaceView是视图(View)的继承类,surfaceView控制这个surface的绘制位置。
surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,surface的排版显示受到视图层级关系的影响,它的兄弟视图节点会在顶端显示。
我们可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。

surfaceview提供了两个线程:UI线程和渲染线程。

第二种方法
首先定义一个类实现Camera.PreviewCallback接口,然后在它的onPreviewFrame(byte[] data, Camera camera)方法中即可接收到每一帧的预览数据,也就是参数data。
然后使用setPreviewCallback(), setOneShotPreviewCallback或者setPreviewCallbackWithBuffer()注册回调接口。
最后使用addCallbackBuffer(byte[] callbackBuffer)添加一个预分配的缓冲区到预览回调缓冲区队列中。这个方法只有在使用setPreviewCallbackWithBuffer(PreviewCallback)时才有必要使用。当使用setPreviewCallback(PreviewCallback)或者setOneShotPreviewCallback(PreviewCallback)时,缓冲区会自动分配。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值