// 在我们的样例中,SurfaceView 会自动更新。
// ImageReader 有自己的回调,我们必须监听,以检索帧
// 所以不需要为捕获请求设置回调
session.setRepeatingRequest(combinedRequest.build(), null, null)
如果你正确配置了目标 surfaces,则此代码将仅生成满足 [StreamComfigurationMap.GetOutputMinFrameDuration(int, Size)](
) 和 [StreamComfigurationMap.GetOutputStallDuration(int, Size)](
) 确定的最小 FPS 流。实际表现还会因机型而异,Android 给了我们一些保证,可以根据**输出类型**,**输出大小**和**硬件级别**三个变量来支持特定组合。使用不支持的参数组合可能会以低帧率工作,甚至不能工作,触发其中一个故障回调。[文档](
)非常详细地描述了保证工作的内容,强烈推荐完整阅读,我们在此将介绍基础知识。
### 输出类型
**输出类型**指的是帧编码格式,文档描述中支持的类型有 PRIV、YUV、JEPG 和 RAW。文档很好的解释了它们:
> PRIV 指的是使用了 [StreamConfigurationMap.getOutputSizes(Class)](
) 获取可用尺寸的任何目标,没有直接的应用程序可见格式
> YUV 指的是目标 surface 使用了 [ImageFormat.YUV\_420\_888](
) 编码格式
> JPEG 指的是 [ImageFormat.JPEG](
) 格式
> RAW 指的是 [ImageFormat.RAW\_SENSOR](
) 格式
当选择应用程序的输出类型时,如果目标是使兼容性最大化,推荐使用 [ImageFormat.YUV\_420\_888](
) 做帧分析并使用 [ImageFormat.JPEG](
) 保存图像。对于预览和录像传感器来说,你可能会用一个 `SurfaceView`、`TextureView`、`MediaRecorder`、`MediaCodec` 或者 `RenderScript.Allocation`。在这些情况下,不指定图像格式,出于兼容性目的,它将被计为 [ImageFormat.PRIVATE](
)(不管它的实际格式是什么)。去查看设备支持的格式可以使用如下代码:
val characteristics: CameraCharacteristics = …
val supportedFormats = characteristics.get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).outputFormats
### 输出大小
我们调用 [StreamConfigurationMap.getOutputSizes()](
) 可列出所有可用的**输出大小**,但随着兼容性的发展,我们只需要关心两种:PREVIEW 和 MAXIMUM。我们可以将这种大小视为上限;如果文档中说的 PREVIEW 的大小有效,那么任何比 PREVIEW 尺寸小的都可以,MAXIMUM 同理。这有一个[文档](
)的相关摘录:
> 对于尺寸最大的列,PREVIEW 意味着适配屏幕的最佳尺寸,或 1080p(1920x1080),以较小者为准。RECORD 指的是相机支持的最大分辨率由 [Camcorder