-
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
p>
。
CameraCharacteristics
< br>是
CameraDevice
的属性描述类,
在
CameraCharacteristics
中可以进行相机设备功能的详细设定(当然了,首先你得确定你的相机设备支持这些功
能
才行)。
类图中有着三个重要的
ca
llback
,其中
eCallback
将
处理预览和拍照图片的工作,需要重点对待。
这些类是如何相互配合的?下面是简单的流程图:
1.
可以
看出调用
openCamera
方法后会回调
< br>allback
这个
方法,在该方法里重写
onOpened
函数。
2.
在
on
Opened
方
法
中
< br>调
用
createCaptureSession
,
该
方
法
又
回
调
allback<
/p>
方法。
3.
在
allback
中重写
onConfigured
方法,设置
setRep
eatingRequest
方法(
也就是开启预览了
)。
4.
setRepeatingRequest
又会回调
eCallback
方法。
5.
重写
e
Callback
中的
onCap
tureCompleted
方法,
result
就是未经过处理的元数据了。
顺便提一下
onCaptureProgressed
方法很明显是在
Capture
过程中的,
也就是在
onCaptureCompleted
之前,所以,在这之前相对图像干什么
就看你的了,像美颜等
操作就可以在这个方法中实现了。
p>
可以看出
Camera2
相机使用的逻辑还
是比较简单的,
其实就是
3
个
Callback
函数
的回调,先说一下:
p>
setRepeatingRequest
和
capture
方法其实都是向相机设备发送
获取图像的请求
,但是
capture
就获取那么一次,而
setRepeatingRequest
就是不停
的获取
图像数据,所以呢,使用
capture
就想拍照一样,图像就
停在那里了,但是
setRepeatingRequest
一
直在发送和获取,所以需要连拍的时候就调用它,然后在
onCaptureCompl
eted
中
保
存
图
像
就
行
了
。
(
注
意
p>
了
,
图
像
的
预
览
也
是
用
的
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]);
p>
//
在这里可以通过
CameraChar
acteristics
设置相机的功能
,
当然必须检查是否支持
(_SUPPORTED_HARDWARE_LEVEL);
//
就像这样
mera(CameraIdList[0],
mCameraDeviceStateCallback
,
mHandler);//
添加相机驱动的回调对象
} 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.
获取相机驱动的回调
//
在相机打开时开启相机预览
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
保存图片详情参考下面工具类
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
;
-
-
-
-
-
-
-
-
-
上一篇:Android-Camera2提升及调用详解
下一篇:h3c系统基本配置命令