检测与 Retina Flash 相关的相机闪光灯

Posted

技术标签:

【中文标题】检测与 Retina Flash 相关的相机闪光灯【英文标题】:Detecting Camera Flash with respect to Retina Flash 【发布时间】:2016-06-09 10:11:28 【问题描述】:

我们将 UIImagePickerController 与我们的自定义 UI 按钮一起使用。我遇到了一个问题,我找不到用于检测 Retina Flash 的 API。 Apple sample code我发现有同样的问题。

这是我在 Flash 上找到的所有内容。如您所见,在使用后置摄像头时,无法知道 iPhone 6S 是否有 Retina Flash。

- (void)flashTest 

    if ([UIImagePickerController isFlashAvailableForCameraDevice:_delegate.imagePickerController.cameraDevice]) 
        NSLog(@"isFlashAvailableForCameraDevice = YES");
     else 
        NSLog(@"isFlashAvailableForCameraDevice = NO");
    

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if ([device hasFlash]) 
        NSLog(@"device hasFlash - YES");
     else 
        NSLog(@"device hasFlash - NO");
    

    if ([device isFlashActive]) 
        NSLog(@"Flash is not active");
     else 
        NSLog(@"Flash IS active");
    

    if ([device isFlashModeSupported:AVCaptureFlashModeOn]) 
        NSLog(@"Flash mode supported YES");
     else 
        NSLog(@"Flash Mode not supproted.");
    

输出:

iPod Touch Back
----------------
isFlashAvailableForCameraDevice = YES  
device hasFlash - YES  
Flash IS active  
Flash mode supported YES  

iPod Touch Front
----------------
isFlashAvailableForCameraDevice = NO  
device hasFlash - YES  
Flash IS active  
Flash mode supported YES  

iPhone 6S Back
----------------
isFlashAvailableForCameraDevice = YES  
device hasFlash - YES  
Flash IS active
Flash mode supported YES  

iPhone 6S Front
---------------
isFlashAvailableForCameraDevice = NO  
device hasFlash - YES  
Flash IS active
Flash mode supported YES

iPad Air Back
--------------
isFlashAvailableForCameraDevice = NO
device hasFlash - NO
Flash IS active
Flash Mode not supproted.

iPad Air Front
--------------
isFlashAvailableForCameraDevice = NO
device hasFlash - NO
Flash IS active
Flash Mode not supproted.

文档说。

视网膜闪光灯

在受支持的设备上,显示屏亮度可以短暂增加到其通常最大照度的 3 倍,以用作前置摄像头的闪光灯。使用此功能时,显示器也会改变其颜色输出,以达到与后置摄像头的 True Tone 闪光灯相同的效果。没有单独的 API 控制此功能——在受支持的设备上,AVCaptureDevice hasFlash 属性反映了前置摄像头的 Retina Flash 可用性。与后置摄像头一样,您可以使用 isFlashModeSupported: 和 flashMode 属性来控制闪光灯。

我提交了一个错误。 http://www.openradar.appspot.com/radar?id=4941073017208832

更新

我检查后置和后置摄像头。我打电话给flashTest 两次:最初和在我使用以下代码在我的自定义 UI 中翻转相机之后。

_delegate.imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;

TL;DR; 无法确定 Flash 是否可用。使用 iPod Touch 外壳 @9​​87654328@ 返回 YES 即使我使用前置摄像头,isFlashAvailableForCameraDevice 分别返回正确的 YESNO 用于 iPod 背面,但在 iPhone 6S 上返回相同的 YESNO虽然它有 Retina Flash。

【问题讨论】:

【参考方案1】:

Retina 闪光灯仅适用于前置摄像头,不适用于后置摄像头。在这里,您检查了后置摄像头。所以,它返回 no。

【讨论】:

请使用setter方法设置imagePicker UIImagePickerController的cameraDevice属性 *picker = [[UIImagePickerController alloc] init]; [picker setCameraDevice:UIImagePickerControllerCameraDeviceFront];【参考方案2】:

您需要检查您的活动摄像头设备是否为前置摄像头并且是否有闪光灯可用,这意味着该设备有 Retina Flash,因为只有 6s 以后的 Retina 设备才有前置摄像头闪光灯。代码在这里 -

-(AVCaptureDevice *)getFrontCameraDevice

    NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    AVCaptureDevice *captureDevice = nil;
    for (AVCaptureDevice *device in videoDevices)
    
        if (device.position == AVCaptureDevicePositionFront)
        
            captureDevice = device;
            break;
        
    

    return captureDevice;


-(BOOL)hasRetinaFlash:(AVCaptureDevice *)device

    if (device.position == AVCaptureDevicePositionFront && device.hasFlash) 
         return YES;
    

    return NO;

【讨论】:

你说得对,不幸的是,我还需要一段时间才能测试这个解决方案。如果有人发现此解决方案有效,我将不胜感激,请告诉我,我会接受。 好吧,我正在做一个名为 Raydium 的应用程序,你很快就会在 App Store 中看到它。这个应用程序在低光下人为地调整曝光和iso,如果没有的话,它会模拟苹果的视网膜设备前屏闪光灯,所以我使用的是我在这里粘贴的相同代码,它对我有用。 我在我的代码中将其稍微更改为一个类别,使其看起来不错且易于评估,这看起来像是我的另一个答案。【参考方案3】:
#import "AVCaptureDevice+Extension.h"

@implementation AVCaptureDevice (Extension)

-(BOOL)hasRetinaFlash

    if(self.position == AVCaptureDevicePositionFront && self.hasFlash) 
        return YES;
    

    return NO;


-(BOOL)isFrontCamera

    return (self.position == AVCaptureDevicePositionFront);



-(BOOL)isBackCamera

    return (self.position == AVCaptureDevicePositionBack);

【讨论】:

以上是关于检测与 Retina Flash 相关的相机闪光灯的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.RuntimeException:无法连接到相机服务

相机 2 API 视频录制 - 自动闪光不工作

相机打开时闪光灯不工作

ios检测心率[重复]

Android系统之路(初识MTK) ------Android11.0给系统相机添加闪光灯低电Toast提醒

Android系统之路(初识MTK) ------Android11.0给系统相机添加闪光灯低电Toast提醒