android 设置自动曝光,Android Camera2 API手动曝光更改(Android Camera2 API manual exposure change)...

Android Camera2 API手动曝光更改(Android Camera2 API manual exposure change)

根据官方谷歌团队声明,CONTROL_AE_EXPOSURE_COMPENSATION手动更改在Android 5.1上被破坏。 我正在寻找一个解决方法几天,我找到的唯一一个连接到SENSOR_INFO_SENSITIVITY_RANGE。 但是,我发现使用它有些困难。 我的代码看起来像这样:

if(!modeDisabled){

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);

modeDisabled=true;

}

range1 = characteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);

minmin = range1.getLower();

maxmax = range1.getUpper();

int iso = ((i * (maxmax - minmin)) / 100 + minmin);

mPreviewRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, iso);

mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mBackgroundHandler);

当然,'i'值是从搜索栏获取的进度值,并且在OnProgressChanged函数中关闭每个值。

问题是操作搜索栏时没有明显的变化。 我真的很感激任何帮助。

According to offical google team statement the CONTROL_AE_EXPOSURE_COMPENSATION manual change is broken on Android 5.1. I'm lookin for a workaround for couple of days and the only one I found is connected to SENSOR_INFO_SENSITIVITY_RANGE. However, I found some difficulties in using it. My code look like this:

if(!modeDisabled){

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);

modeDisabled=true;

}

range1 = characteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);

minmin = range1.getLower();

maxmax = range1.getUpper();

int iso = ((i * (maxmax - minmin)) / 100 + minmin);

mPreviewRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, iso);

mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mBackgroundHandler);

Of course the 'i' value is a progress value taken from the seekbar and everyting is closed in OnProgressChanged function.

The problem is that there are no visible changes when manipulating the seekbar. I'd be really gratetful for any help.

原文:https://stackoverflow.com/questions/30345757

更新时间:2021-03-08 11:03

最满意答案

一般来说,CONTROL_AE_EXPOSURE_COMPENSATION在Android 5.1中没有被破坏,仅在Nexus 6上被禁用(并且将在未来的更新中重新启用)。

如果您禁用自动曝光,除了灵敏度之外,您可能还需要设置曝光时间。 您最好也需要设置帧持续时间,但两者的默认值可能是1 / 30s,这是合理的。 您还可以复制自动曝光的最新捕获结果中的最新值。

也就是说,你仍然应该看到某种变化。 在您将捕获请求设置为重复请求后,您是否有可能在其他地方覆盖捕获请求? 您可以检查返回的捕获结果,以查看相机设备接收的灵敏度设置。

CONTROL_AE_EXPOSURE_COMPENSATION isn't broken in Android 5.1 in general, it was disabled on the Nexus 6 only (and will be re-enabled in a future update).

If you're disabling auto-exposure, you probably also need to set the exposure time, in addition to the sensitivity. You also preferably need to set the frame duration, though the defaults for both are probably 1/30s, which is reasonable. You can also copy the latest values for those from the most-recent capture result that did you auto-exposure.

That said, you should still see some sort of change here. Is it possible that you're overwriting your capture request elsewhere right after you set this one as the repeating request? You can check the returned capture results to see what the sensitivity setting the camera device is receiving is.

2015-05-25

相关问答

其实,检查API版本21+将工作。 camera2 API(包括CameraManager是系统的一部分,不依赖于硬件。 因此,您可以随时向CameraManager询问CameraDevice的列表,然后您可以单独进行查询。 但是,我认为你实际上的意思是“我怎么知道我是否可以使用camera2 API手动设置摄影参数?”,这取决于你所拥有的设备。 这取决于你需要什么样的控制,但你需要的信息可以通过获取REQUEST_AVAILABLE_CAPABILITIES 元数据字段来获得。 提示:寻找MA

...

即使旧的相机API被标记为已被弃用,但它仍然完全正常运行,并且将保持相当一段时间(因为Play Store上几乎所有使用相机的应用程序都使用它)。 您将不得不忽略Android Studio关于弃用的投诉,但如果您希望支持早于21的Android版本,则必须使用旧的API。 在API级别21上,您当然可以使用新的API及其新功能,但如果您在API之间切换,那么您现在必须在应用程序中保持完全独立的流程。 不幸的是,这两个API的世界观不尽相同,很难编写一个支持库,可以让您在旧设备上使用类似新API的

...

因为您的问题我开始阅读并深入研究,我相信这就是它的工作方式。 根据文档( 链接 )说: 每个请求将生成一个CaptureResult并为一个或多个目标曲面生成新帧 注意它说“框架s ”。 复数。 说我相信你应该只考虑来自onCaptureCompleted回调的最后一帧。 since your question I started reading and digging into it, and I believe that's the way it works. As per doc (link

...

一般来说,CONTROL_AE_EXPOSURE_COMPENSATION在Android 5.1中没有被破坏,仅在Nexus 6上被禁用(并且将在未来的更新中重新启用)。 如果您禁用自动曝光,除了灵敏度之外,您可能还需要设置曝光时间。 您最好也需要设置帧持续时间,但两者的默认值可能是1 / 30s,这是合理的。 您还可以复制自动曝光的最新捕获结果中的最新值。 也就是说,你仍然应该看到某种变化。 在您将捕获请求设置为重复请求后,您是否有可能在其他地方覆盖捕获请求? 您可以检查返回的捕获结果,以查看

...

选项A:使用这两种API 步骤1:将您的compileSdkVersion设置为21或更高。 理想情况下,将其设置为25,以获得最新版本的Android。 步骤#2:为两个API编写代码。 步骤#3:当设备运行Android 5.0+时,只调用使用android.hardware.camera2类的代码: if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {

// use camera2

}

else {

// use Cam

...

您只发送一个捕获请求吗? 或者您是在后台运行重复请求,然后只按下按钮时发出高分辨率捕获? 前者不会真正起作用 - 您必须有一系列请求才能使自动曝光,聚焦和白平衡算法收敛到良好的值。 单次捕获将无法正确计量或聚焦。 请看一下Camera2Basic样本; 如果您只使用SurfaceTexture替换该示例中的TextureView(给它一个随机纹理ID并且不调用updateTexImage),那么您可以不进行预览。 但它正确地实现了聚焦和预捕获触发,这对你来说至关重要。 例如,触发器只能在一个请求上

...

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener

= new ImageReader.OnImageAvailableListener() {

@Override

public void onImageAvailable(ImageReader reader) {

try (Image image = reader

...

您需要声明在创建CameraCaptureSession时可能要将图像数据发送到的所有输出Surface 。 这只是框架设计的方式。 无论何时创建CaptureRequest ,都可以添加(列表)目标输出Surface 。 这是来自捕获帧的图像数据将去的地方 - 它可能是与用于显示的TextureView关联的Surface ,或者用于保存的ImageReader ,或者用于处理的Allocation等。( Surface实际上只是一个缓冲区,可以获取摄像机输出的数据,缓冲区关联的对象类型决定了如

...

旧的相机API适用于#1和#3; 如果你对视频分辨率GIF没问题,你也可以做#2。 您需要camera2(以及支持快速,全分辨率捕获的设备 - 请参阅BURST_CAPTURE功能,或任何支持FULL硬件级别的设备。),如果您想要分辨率高于~1080p的突发。 您可以从CameraView非官方支持库开始,并根据需要进行修改。 它支持两种API,基于设备的API级别进行选择。 The old camera API will work fine for #1 and #3; if you're OK

...

我只是按照Android文档使用相机API。 Camera2 API相当新,我想确保所有用户都能拥有它。 I simply followed the Android docs to use the camera API. Camera2 API is fairly new and I want to make sure all users can have it.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值