[译] 同时使用多的相机流,阿里巴巴安卓面试题答案

// 在我们的样例中,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值