关键词不能为空

当前您在: 主页 > 英语 >

Android Camera2提升及调用详解

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-12 15:01
tags:

-

2021年2月12日发(作者:blueprint)


Camera2


详解




官方的说法:


Camera2 API


?



Supports 30fps full resolution with burst mode


支持


30fps


的全高清连拍



?



Supports change on manual camera settings between frame capture


支持帧之间的手动设置



?



Supports RAW image capture


支持


RAW

< br>格式的图片拍摄



?



Supports Zero Shutter Lag & Movie Snapshot


支持快门


0


延迟 以及电影速拍



?



Supports setting other manual camera device controls including level of


Noise Cancelling


支持相机其他方面的手动控制包括噪音消除的级别



?



TextureView


代替


SurfaceView


展示预览




还有部分新功能没有列出













Google


采用了


pipeline


(管道)的概念,将


Camera Device


相机设备和


Android


Device


安卓


设备连接起来,



android


Device


通过管 道发送


CaptureRequest


拍照请求给


Camera Device



Camera De vice


通过管道返回


CameraMetadata


数据给


Android Device


,这一切 建立在一个叫作


CameraCaptureSession


的 会话中。










下面是


camera2


包中的主要类:




其中


CameraManager


是所有相机设备(


CameraDevice


)的管理者,而每个


Cam eraDevice


自己会负责建立


CameraCaptur eSession


以及建立


CaptureRequest



CameraCharacteristics

< br>是


CameraDevice


的属性描述类,

< p>


CameraCharacteristics


中可以进行相机设备功能的详细设定(当然了,首先你得确定你的相机设备支持这些功


能 才行)。



类图中有着三个重要的


ca llback


,其中


eCallback



处理预览和拍照图片的工作,需要重点对待。







这些类是如何相互配合的?下面是简单的流程图:




1.



可以 看出调用


openCamera


方法后会回调

< br>allback


这个


方法,在该方法里重写


onOpened


函数。



2.




on Opened




< br>调



createCaptureSession





< p>




allback< /p>


方法。



3.




allback


中重写


onConfigured


方法,设置


setRep eatingRequest


方法(


也就是开启预览了


)。



4.



setRepeatingRequest


又会回调


eCallback


方法。



5.



重写


e Callback


中的



onCap tureCompleted


方法,


result


就是未经过处理的元数据了。



顺便提一下


onCaptureProgressed


方法很明显是在


Capture


过程中的,


也就是在


onCaptureCompleted


之前,所以,在这之前相对图像干什么 就看你的了,像美颜等


操作就可以在这个方法中实现了。



可以看出


Camera2


相机使用的逻辑还 是比较简单的,


其实就是


3



Callback


函数


的回调,先说一下:


setRepeatingRequest



capture


方法其实都是向相机设备发送


获取图像的请求 ,但是


capture


就获取那么一次,而

setRepeatingRequest


就是不停


的获取 图像数据,所以呢,使用


capture


就想拍照一样,图像就 停在那里了,但是


setRepeatingRequest


一 直在发送和获取,所以需要连拍的时候就调用它,然后在


onCaptureCompl eted

























setRepeat ingRequest


,只是你不处理数据就行了)
















调用流程


:


1.


获取


TextureView


对 象



mPreviewView=(TextureView) findViewById(eview);


faceTextureListener(this);//


eView


初始化完毕开始初始化相机并绑定


CameraI D



@SuppressWarnings(






@Override






public void onS urfaceTextureAvailable(SurfaceT


exture surface, int width, int height) {


CameraManager cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);










try {














String[] CameraIdList = eraIdList();















//


获取可用相机设备列表















CameraCharacteristics characteristics =



eraCharacteristics(CameraIdList[0]);














//


在这里可以通过


CameraChar acteristics


设置相机的功能


,

当然必须检查是否支持















(_SUPPORTED_HARDWARE_LEVEL);














//


就像这样















mera(CameraIdList[0],


mCameraDeviceStateCallback


,


mHandler);//


添加相机驱动的回调对象

< p>










} catch (CameraAccessException e) {














tackTrace();










}






}







@Override






public void onSurfaceTextureSizeChanged (SurfaceT


exture surface, int width, int height) {}







@Override






public boolean onSurfaceT


ext ureDestroyed(SurfaceTexture surface) {










return false;






}







@Override






public void onSurfaceTextureUpdated(SurfaceT


exture surface) {}


3.


获取相机驱动的回调

< p>
//


在相机打开时开启相机预览



allback


mCameraDeviceStateCallback


=


new


allback() {



@Overridepublicvoid onOpened(CameraDevice camera) {


try {



startPreview(camera);



}



catch (CameraAccessException e)



{



tackTrace(); }



}



@Override


publicvoid onDisconnected(CameraDevice camera) {}



@Override


publicvoid onError(CameraDevice camera, int error) {} };



4.

开启相机预览


//


创建


Sessi on


对象


,


获取图像抓取对象



private void startPreview(CameraDevice camera) throws CameraAccessException {



SurfaceTexture texture = faceTexture();


aultBufferSize(th(), ght());



Surface surface = new Surface(texture);



try {



mPreviewBuilder = CaptureRequest(TE_STILL_CAPTURE);



} catch (CameraAccessException e) {



tackTrace();



}




arget(surface);



CaptureSession((surface),


mSessionStateCallback


, mHandler); }


5.


通过


Session


抓取图片



private allback mSessionStateCallback = new


allback() {



@Override public void onConfigured(CameraCaptureSession session) {



try {



//


抓取图片



//e((),


mSessionCaptureCallback


, mHandler);



//


图像持续反馈



eatingRequest((),


mSessionCaptureCallback


, mHandler);//



} catch (CameraAccessException e) {



tackTrace();



}



}



@Override



public void onConfigureFailed(CameraCaptureSession session) {} };


n


回调优化图片



private eCallback mSessionCaptureCallback = new


eCallback() {



@Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest


request, TotalCaptureResult result) {


//TODO


保存图片



}



@Override public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest


request, CaptureResult partialResult){


//TODO


进行美颜等优化操作



}};


7.


通过


ImageReader

< p>
保存图片详情参考下面工具类




Camera2


工具类


:


package



;



import


t


;


import



;


import


ormat


;


import


eTexture


;


import


AccessException


;


import


CaptureSession


;


import


Characteristics


;


import


Device


;


import


Manager


;


import


Metadata


;


import


eRequest


;


import


aptureResult


;


import


ConfigurationMap


;


import



;


import


eader


;


import


nment


;


import


r


;


import


rThread


;


import


l


;


import



;


import



;


import


IntArray


;


import


e


;


import


eView


;


import


ayout


;


import



;


-


-


-


-


-


-


-


-



本文更新与2021-02-12 15:01,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/644109.html

Android Camera2提升及调用详解的相关文章