本讲是android camera专题系列的第21讲,我们介绍android camera2 api专题的createcapturesession详解。
更多资源:
资源 | 描述 |
---|---|
在线课程 | |
知识星球 | 星球名称:深入浅出android camera 星球id: 17296815 |
极客笔记圈 |
createcapturesession (sessionconfiguration config)注意事项
创建cameracapturesession
- 创建cameracapturesession时,需要包含所有的output/input surfaces
-
创建好cameracapturesession后,提交的capturerequest中带的surfaces只能在这组surfaces里面选择
创建cameracapturesession一般需要几百毫秒,camera hal会对一些硬件做上电操作、创建pipeline动作等等
cameracapturesession的切换
- 直接调用createcapturesession,前面的cameracapturesession会被close掉
-
最快的切换方式
- 先调用旧cameracapturesession#abortcaptures,再创建新的cameracapturesession
根据不同的场景选择surface
场景 | surface组件 | 使用方法 |
---|---|---|
preview | surfaceview | surfacecreated(surfaceholder holder)时调用surfaceholder.setfixedsize(int, int)设置size,然后调用surfaceholder.getsurface()来获取surface |
opengl es处理(preview) | surfacetexture | 调用surfacetexture.setdefaultbuffersize(int, int)设置size,然后通过new surface(surfacetexture)来获取surface |
录像 | mediacodec | 配置完mediacodec后,调用mediacodec.createinputsurface()来获取surface |
录像 | mediarecorder | 配置完mediarecorder后,调用mediarecorder.getsurface()来获取surface |
yuv处理 | renderscript | 配置好allocation后,调用allocation.getsurface()来获取surface |
抓图(raw/yuv/jpeg…) | imagereader | 配置好imagereader后,调用imagereader.getsurface()来获取surface |
reprocess | cameracapturesession | cameracapturesession创建好后,调用cameracapturesession#getinputsurface来获取surface |
流配置表说明
format
- priv: imageformat.private,对app透明的
-
yuv: imageformat.yuv_420_888
-
jpeg: imageformat.jpeg
-
raw: imageformat.raw_sensor
size
-
preview:跟屏幕宽高比一致,<=1080p
-
record: camcorderprofile中定义的最大录像size
-
maximum: streamconfigurationmap#getoutputsizes中的最大值
-
multi_res : multiresolutionstreamconfigurationmap#getoutputinfo(int)获取到的值
超出流配置表限制
如何理解是否超出表格限制
- 某一行表示一个streams configuration组合,比如这一行支持8mp yuv和2mp priv
- [8 mp yuv, 2 mp priv] 或者 [2 mp yuv, 2 mp priv]组合配置能成功
-
[8 mp yuv, 4 mp priv], 或者 [4 mp yuv, 4 mp priv], 或者 [8 mp priv, 2 mp yuv]不能确保是否成功
-
如果app使用超出下面表格限制的surfaces来创建session,有三种可能发生
- cameracapturesession能创建成功,并能正常工作
-
cameracapturesession能创建成功,但帧率无法达到streamconfigurationmap#getoutputminframeduration的要求
-
cameracapturesession创建失败
-
也有可能可以成功创建session,可以通过如下两种方式尝试
- issessionconfigurationsupported(sessionconfiguration)
-
调用createcapturesession看是否不会发生exception 或 收到onconfigured回调
regular流配置表
regular capture – legacy
regular capture – limited
regular capture – full
regular capture – raw capability
regular capture – burst capability
regular capture – level_3
regular capture – concurrent stream
regular capture – multiresolutionoutputs legacy level
regular capture – multiresolutionoutputs limited level
regular capture – 特殊对待qcif
- 前面介绍的一定支持的流配置表时,提到只要小于这个表中的size也能支持,但有一个例外:qcif(176×144)
-
因为通常camera底层的downscale能力都是有限的(最大能downscale多少倍),如果从>= 1920×1080的分辨率downscale到176×144,有可能不支持
constrained high-speed recording流配置
支持constrained_high_speed_video capability
帧率>=120fps
与普通capture session比,有如下限制
-
最多支持2个output surfaces
-
每个output surface的size必须一样,来自streamconfigurationmap#gethighspeedvideosizes
-
只能通过captureburst 或 setrepeatingburst方法向camera底层送capturerequest list,capturerequest list来自cameraconstrainedhighspeedcapturesession#createhighspeedrequestlist
-
fps range必须来自streamconfigurationmap#gethighspeedvideofpsrangesfor