Camera2 闪光灯梳理

转载:

原文链接:https://blog.csdn.net/qq_36391075/article/details/90601312

 一、

在Android Camrea2中与Flash有关的只有两个字段:

CaptureRequest.FLAH_MODE
CaptureRequest.CONTROL_AE_MODE

所有在使用闪光灯时,必须先保证CaptureRequest.CONTROL_MODE为ATUO,而且必须保证CameraCharacteristics.FLASH_INFO_AVAILABLE == true 。

首先先说说CaptureRequest.FLAH_MODE,这个字段是可以由用户控制的,要使用它的话,还要保证CaptureRequest.CONTROL_AE_MODE的值为ON或者OFF,它有三个值:

OFF:this catpure 闪光灯关闭 
SINFGLE:this capture 闪光灯打开
TORCH:闪光灯持续打开

然后再看看CaptureRequest.CONTROL_AE_MODE,用于选择当前自动曝光模式的控件:

通过CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES进行查询支持的模式。

OFF:自动曝光停用,用户控制曝光,增益,帧时长和闪光。
ON:标准自动曝光,闪光灯控件停用,用户可以将闪光灯设置为触发或者手电筒模式。        
ON_AUTO_FLASH:标准自动曝光,闪光灯听从HAL指令开启,以进行预拍摄和静像拍摄.
    不允许用户控制闪光灯的功能。在预拍摄期间可能打开闪光灯,
    和 如果CaptureRequest.CONTROL_CAPTURE_INTENT被设置为STILL_CAPTURE,
    闪光灯将一直打开。
ON_ALWALYS_FLASH:标准自动曝光,闪光灯始终触发以进行拍摄,并听从HAL指令进行
    预拍摄。不允许用户控制闪光灯的功能。它类似于ON模式,在预拍摄期间可能打
    开闪光灯,如果CaptureRequest.CONTROL_CAPTURE_INTENT被设置
    为STILL_CAPTURE,闪光灯将一直打开。
ON_AUTO_FLASH_REDEYE:标准自动曝光,闪光灯听从HAL指令开启,以进行预拍摄
   和静像拍摄。在预拍摄序列结束时使用闪光灯连拍,以减轻最终照片中的红眼现象。
    不允许用户控制闪光灯的功能。如果被相机认为有必要的话,在预拍摄期间,为减
    少红眼现象的闪光灯会打开。

在AE的状态中,有两个与闪光灯有关的状态:

1.AE_STAET_FLASH_REQUIRED:
     HAL已聚焦曝光,但认为需要启动闪光灯才能保证亮度充足。
     用于确定是否可使用零快门延迟帧。   
     
 2.AE_STATE_PRECATURE:
     HAL正在处理预拍序列。根据AE模式,该模式可能包括触发闪光灯以进行测光
     或发出闪光脉冲以减轻红眼现象

          二、系统摄像机的闪光灯模式

1)录像

录像情况下,闪光灯的模式很简单,就两个:

闪光灯关闭 
闪光灯打开

2)拍照:相对于录像,拍照模式下,闪光灯的设置就多了很多 

前置摄像头


闪光灯关闭 
闪光灯自动:亮光条件下:闪光灯不开启。
           暗光条件下:预览和拍照时闪光灯一直打开
闪光灯开启
后置摄像头 


闪光灯关闭 
闪光灯自动 
亮光条件下:闪光灯不开启 
暗光条件下:
       预览时闪光灯不打开,对焦时闪光灯打开,拍照时,闪光灯先打开,
       再闪光拍照。
闪光灯在拍照时才打开:在拍照时,闪光灯打开一次 
闪光灯打开

                                三、Camera2 中对闪光灯的设置 

对比于系统摄像机的闪光灯模式,在我们自己的APP中的设置:

1)录像模式

   1.1 闪光灯关闭:

对焦正常,前后摄像头切换正常
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
                       CaptureRequest.CONTROL_AE_MODE_ON);
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,
                        CameraMetadata.FLASH_MODE_OFF);

   1.2 闪光灯打开:

对焦正常,前后摄像头切换正常
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                    CaptureRequest.CONTROL_AE_MODE_ON); 
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, 
                    CameraMetadata.FLASH_MODE_TORCH);

  1.3 闪光灯自动:

前置摄像头:

亮光条件下:闪光灯不打开,对焦正常 

暗光条件下:闪光灯打开,对焦正常 

后置摄像头:

亮光条件下:闪光灯不打开,对焦正常

暗光条件下:闪光灯不打开,对焦正常,在对焦时,闪光灯打开

mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
            CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,
            CaptureRequest.FLASH_MODE_OFF);

不要忘记设置FLASH_MODE为OFF,否则会影响闪光灯的开启。

2) 拍照模式

2.1 闪光灯关闭 

在预览时设置:
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
               CaptureRequest.CONTROL_AE_MODE_ON); 
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,
               CameraMetadata.FLASH_MODE_OFF);
拍照时设置:也可以不用再设置
builder.set(CaptureRequest.CONTROL_AE_MODE, 
             CaptureRequest.CONTROL_AE_MODE_ON); 
builder.set(CaptureRequest.FLASH_MODE,
             CaptureRequest.FLASH_MODE_OFF);

2.2 闪光灯打开 

预览时设置:
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
         CaptureRequest.CONTROL_AE_MODE_ON);
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, 
         CameraMetadata.FLASH_MODE_TORCH);
拍照时设置:
builder.set(CaptureRequest.CONTROL_AE_MODE, 
          CaptureRequest.CONTROL_AE_MODE_ON); 
builder.set(CaptureRequest.FLASH_MODE, 
          CaptureRequest.FLASH_MODE_TORCH);

若拍摄时,不设置,会造成拍照时闪光灯关闭。若拍照时设置为

builder.set(CaptureRequest.CONTROL_AE_MODE,
          CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);

会是在拍照时闪光灯关闭。

2.3 闪光灯自动 

   2.3.1前置摄像头:

亮光条件下:预览时闪光灯不会打开,拍照时闪光灯不打开

暗光条件下:

预览和拍照时闪光灯打开。(没有实现出来)

预览时设置:
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
                 CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,
                 CaptureRequest.FLASH_MODE_OFF);
拍照时设置:
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
       CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

若拍照时设置 AE_MODE_ON_AUTO_FLASH ,则拍照时闪光灯会关闭。在系统摄像头的表现上应该是闪光灯一直开启。

2.3.2 后置摄像头:

亮光条件下:预览时闪光灯不会打开,拍照时闪光灯不打开

暗光条件下:预览时闪光灯不打开,对焦时闪光灯打开,拍照时闪光灯打开 

预览时设置:


mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                   CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,
                         CaptureRequest.FLASH_MODE_OFF);
拍照时设置:
builder.set(CaptureRequest.CONTROL_AE_MODE, 
         CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

2.4 闪光灯在拍照时打开

2.4.1前置摄像头:

预览时闪光灯不打开,拍照时闪光灯打开

预览时设置:
mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
                    CaptureRequest.CONTROL_AE_MODE_ON); 
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE,
                     CameraMetadata.FLASH_MODE_OFF);
拍照时设置:
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); builder.set(CaptureRequest.FLASH_MODE,CaptureRequest.FLASH_MODE_SINGLE);

2.4.2后置摄像头:

预览时设置:


mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
          CaptureRequest.CONTROL_AE_MODE_ON); 
mCaptureRequestBuilder.set(CaptureRequest.FLASH_MODE, 
          CameraMetadata.FLASH_MODE_OFF);

拍照时设置:

builder.set(CaptureRequest.CONTROL_AE_MODE,
                  CaptureRequest.CONTROL_AE_MODE_ON); 
builder.set(CaptureRequest.FLASH_MODE,
                   CaptureRequest.FLASH_MODE_TORCH);

若拍照时设置为 FLASH_MODE_SINGLE ,在后置摄像头上,第一次拍照亮,后续拍照时闪光灯不亮。解决方案时:用后置摄像头拍照时,设置为torch,或者统一设置为torch。

闪光灯减少红眼现象 一般情况下,不需要设置这个,大多数手机不支持。 

c517b5b42b9a633f7754c5c7b476e9c4.png

推荐阅读:

一篇文章带你了解Android 最新Camera框架

这可能是介绍Android UvcCamera最详细的文章了

Android Camera开发系列(干货满满)

高通Camera 软件工程师的成长之路

Android 高通Camx架构学习 - 第1章

深圳上班,

生活简简单单,

从事Android Camera相关软件开发工作,

公众号记录生活和工作的点滴,

点击关注“小驰笔记”,期待和你相遇~

f56ae324375fd22ca3070786187e3cd2.png

237f574b399b2508d1fc38dbb2e8a910.png

一起加油!

posted @ 2021-11-22 09:00  小驰行动派  阅读(126)  评论(0编辑  收藏  举报  来源