iOS AVCaptureDevice

简介

AVCaptureDevice 一种为捕获会话提供输入(例如音频或视频)并提供针对特定于硬件的捕获功能的控件的设备。是关于硬件的接口,用于配置底层硬件的属性(如对焦,闪光灯,曝光等)。这些底层硬件包括前置摄像头、后置摄像头、麦克风、闪光灯等。使用****AVCaptureDevice****向****AVCaptureSession****对象提供输入数据(如音频或视频)。

1. 权限申请

iOS 权限申请字段

首先应该在Info.plist中添加相应的权限字段 如:申请相机权限

<key>NSCameraUsageDescription</key>
<string>使用相机</string>

申请权限通过调用AVCaptureDevice 的 requestAccess方法

 @available(iOS 7.0, *)
    open class func requestAccess(for mediaType: AVMediaType, completionHandler handler: @escaping (Bool) -> Void)

判断是否具有权限通过调用AVCaptureDevice 的 authorizationStatus方法

@available(iOS 7.0, *)
    open class func authorizationStatus(for mediaType: AVMediaType) -> AVAuthorizationStatus
public enum AVAuthorizationStatus : Int {
    //用户尚未授予或拒绝该权限,
    case notDetermined = 0
    //不允许用户访问媒体捕获设备。这个状态通常是看不到的:用于发现设备的`AVCaptureDevice`类方法不会返回用户被限制访问的设备。
    case restricted = 1
    //用户已经明确拒绝了应用访问捕获设备
    case denied = 2
    //用户授予应用访问捕获设备的权限
    case authorized = 3
}

AVMediaType

public struct AVMediaType : Hashable, Equatable, RawRepresentable {
    public init(_ rawValue: String)
    public init(rawValue: String)
}
extension AVMediaType {
    @available(iOS 4.0, *)
    public static let video: AVMediaType

    @available(iOS 4.0, *)
    public static let audio: AVMediaType

    @available(iOS 4.0, *)
    public static let text: AVMediaType

    @available(iOS 4.0, *)
    public static let closedCaption: AVMediaType

    @available(iOS 4.0, *)
    public static let subtitle: AVMediaType

    @available(iOS 4.0, *)
    public static let timecode: AVMediaType

    @available(iOS 6.0, *)
    public static let metadata: AVMediaType

    @available(iOS 4.0, *)
    public static let muxed: AVMediaType

    @available(iOS 9.0, *)
    public static let metadataObject: AVMediaType
    
    @available(iOS 11.0, *)
    public static let depthData: AVMediaType
}

2.初始化方法

//这两个方法在iOS 10.0 之后就不推荐使用了
 @available(iOS, introduced: 4.0, deprecated: 10.0, message: "Use AVCaptureDeviceDiscoverySession instead.")
    open class func devices() -> [AVCaptureDevice]

 @available(iOS, introduced: 4.0, deprecated: 10.0, message: "Use AVCaptureDeviceDiscoverySession instead.")
    open class func devices(for mediaType: AVMediaType) -> [AVCaptureDevice]

推荐使用的方法

// 此方法返回系统上当前可用的给定媒体类型的默认设备。
open class func `default`(for mediaType: AVMediaType) -> AVCaptureDevice?
/*
根据uniqueID 初始化 (可以通过实例的uniqueID属性获取)
每台可用的捕获设备都有一个唯一的ID,该ID会在设备连接和断开连接,应用程序重新启动以及系统本身重新启动后一直存在于一个系统上。 此方法可用于调用或跟踪先前已保存唯一ID的特定设备的状态。
*/ 
public /*not inherited*/ init?(uniqueID deviceUniqueID: String)

使用 AVCaptureDeviceDiscoverySession 获取AVCaptureDevice

public convenience init(deviceTypes: [AVCaptureDevice.DeviceType], mediaType: AVMediaType?, position: AVCaptureDevice.Position)

//通过这个参数获取可用device
var devices: [AVCaptureDevice]]
extension AVCaptureDevice.DeviceType {
    @available(iOS 10.0, *)
    public static let builtInMicrophone: AVCaptureDevice.DeviceType
    
    @available(iOS 10.0, *)
    public static let builtInWideAngleCamera: AVCaptureDevice.DeviceType

    @available(iOS 10.0, *)
    public static let builtInTelephotoCamera: AVCaptureDevice.DeviceType

    @available(iOS 13.0, *)
    public static let builtInUltraWideCamera: AVCaptureDevice.DeviceType

    @available(iOS 10.2, *)
    public static let builtInDualCamera: AVCaptureDevice.DeviceType

    @available(iOS 13.0, *)
    public static let builtInDualWideCamera: AVCaptureDevice.DeviceType

    @available(iOS 13.0, *)
    public static let builtInTripleCamera: AVCaptureDevice.DeviceType
    
    @available(iOS 11.1, *)
    public static let builtInTrueDepthCamera: AVCaptureDevice.DeviceType

    @available(iOS, introduced: 10.0, deprecated: 10.2, message: "Use AVCaptureDeviceTypeBuiltInDualCamera instead.")
    public static let builtInDuoCamera: AVCaptureDevice.DeviceType
}

@available(iOS  4.0, *)
 public enum Position : Int {
   case unspecified = 0
   case back = 1
   case front = 2
 }
枚举名称 解释
builtInMicrophone 内置麦克风。
builtInWideAngleCamera 内置广角相机。
builtInTelephotoCamera 内置摄像头设备的焦距比广角摄像头更长。
builtInUltraWideCamera 内置相机的焦距比广角相机的焦距短。
builtInDualCamera 广角相机和远摄相机的组合
builtInDualWideCamera 一种设备,包括两个固定焦距的相机,一个超广角和一个广角
builtInTripleCamera 一种设备,该设备由三个固定焦距的相机,一个超广角,一个广角和一个长焦相机组成。
builtInTrueDepthCamera 相机和其他传感器的组合,可创建能够进行照片,视频和深度捕捉的捕捉设备。
builtInDuoCamera iOS 10.2 之后不推荐使用
枚举名称 解释
unspecified 未指定
back 后置摄像头
front 前置摄像头

3. AVCaptureDevice相关通知

extension NSNotification.Name {
    @available(iOS 4.0, *)
    public static let AVCaptureDeviceWasConnected: NSNotification.Name

    @available(iOS 4.0, *)
    public static let AVCaptureDeviceWasDisconnected: NSNotification.Name

    @available(iOS 5.0, *)
    public static let AVCaptureDeviceSubjectAreaDidChange: NSNotification.Name
}
通知名称 解释
AVCaptureDeviceWasConnected 当新设备可用时,通知对象是AVCaptureDevice实例,表示已可用的设备。
AVCaptureDeviceWasDisconnected 当现有设备不可用时发送一个通知,通知对象是AVCaptureDevice实例,表示不可用的设备。
AVCaptureDeviceSubjectAreaDidChange AVCaptureDevice实例检测到视频主题区域发生了实质性变化。 仅当您首先将subjectAreaChangeMonitoringEnabled设置为YES时,才发送此通知。
//可用通过 AVCaptureDevice的isConnected 判断指示设备是否已连接并且对系统可用。
open var isConnected: Bool { get }

4. AVCaptureDevice配置

配置设备前需要上锁

     //请求以独占方式访问以配置设备硬件属性。
     //为了在AVCaptureDevice上设置硬件属性,例如focusMode和ExposureMode,客户端必须首先获取设备上的锁。
    open func lockForConfiguration() throws
    
     //释放对设备硬件属性的独占控制权。
     //该方法和lockForConfiguration配对使用:当应用程序不再需要阻止设备硬件属性自动更改时,调用下面方法
    open func unlockForConfiguration()

常用配置属性

闪光灯

  1. 闪光灯定义
    @available(iOS 4.0, *)
    public enum FlashMode : Int {
       //表示闪光灯应始终关闭。
        case off = 0
       //表示闪光灯应始终打开。
        case on = 1
       //表示应根据环境光线条件自动使用闪光灯。
        case auto = 2
    }
  1. 闪光灯相关属性和方法
extension  AVCaptureDevice {
 //判断是否有闪光灯
 open var hasFlash: Bool { get }

 //闪光灯是否可用 
  @available(iOS  5.0, *)
  open  var  isFlashAvailable: Bool { get }


//闪光灯是否正在使用
  @available(iOS, introduced: 5.0, deprecated: 10.0, message: "Use AVCapturePhotoOutput's -isFlashScene instead.")
 open var isFlashActive: Bool { get }

 //闪光灯是否支持 某个AVCaptureDevice.FlashMode
  @available(iOS, introduced: 4.0, deprecated: 10.0, message: "Use AVCapturePhotoOutput's -supportedFlashModes instead.")
  open  func  isFlashModeSupported(_ flashMode: AVCaptureDevice.FlashMode) -> Bool

 /*
 设置闪光灯的FlashMode
 使用AVCapturePhotoOutput时,将忽略AVCaptureDevice的flashMode属性。 您可以通过设置AVCapturePhotoSettings.flashMode属性为每张照片指定flashMode。
 */ 
 @available(iOS, introduced: 4.0, deprecated: 10.0, message: "Use AVCapturePhotoSettings.flashMode instead.")
  open  var  flashMode: AVCaptureDevice.FlashMode
}
  1. 如何使用
 do{//ios10.0之后 不推荐使用这种方式
   //'flashMode' was deprecated in iOS 10.0: Use AVCapturePhotoSettings.flashMode instead.
    try device?.lockForConfiguration()
    device?.flashMode = .on
    device?.unlockForConfiguration()
 }catch{

 }

手电筒

  1. 手电筒定义
 @available(iOS  4.0, *)
 public enum TorchMode : Int {
    //表示手电筒应始终关闭。
    case off = 0
    //表示手电筒应始终开启
    case on = 1
    //指示应根据环境光线条件自动使用手电筒。
    case auto = 2
 }
  1. 手电筒相关属性和方法
extension AVCaptureDevice {
    //是否有手电筒
    open var hasTorch: Bool { get }

    //手电筒是否可用
    @available(iOS 5.0, *)
    open var isTorchAvailable: Bool { get }

    //手电筒是否开启
    @available(iOS 6.0, *)
    open var isTorchActive: Bool { get }

     //获取手电筒亮度 0.0 (off) -> 1.0 (full) 支持KVO
    @available(iOS 5.0, *)
    open var torchLevel: Float { get }

    //是否支持手电筒的AVCaptureDevice.TorchMode
    open func isTorchModeSupported(_ torchMode: AVCaptureDevice.TorchMode) -> Bool

    //设置手电筒模式
    open var torchMode: AVCaptureDevice.TorchMode
    
     /*
      如果iOS设备太热,则指定的值可能不可用 此方法在指定级别将割炬模式设置为
      在手电筒开启状态修改亮度 需要 lockForConfiguration
     */
    @available(iOS 6.0, *)
    open func setTorchModeOn(level torchLevel: Float) throws
    
   //以将手电筒设置为当前可用的最大级别
    @available(iOS  6.0, *)
    public  class  let  maxAvailableTorchLevel: Float
}
  1. 手电筒的使用
 do {
      try device.lockForConfiguration()
      device.torchMode = .on
      try device.setTorchModeOn(level: 0.5) //值必须在0 - 1.0直接,不然会抛出崩溃
      device.unlockForConfiguration()
    } catch  {
 }

自动对焦

  1. 自动对焦的定义
   @available(iOS  4.0, *)
   public enum FocusMode : Int {
      //将焦点锁定在镜头的当前位置。
      case locked = 0
      //设备应自动对焦一次,然后将对焦模式更改为AVCaptureFocusModeLocked。
      case autoFocus = 1
      //设备应在需要时自动对焦。
      case  continuousAutoFocus = 2
   }
   //自动对焦的范围
    @available(iOS 7.0, *)
    public enum AutoFocusRangeRestriction : Int {
       //不应限制自动对焦范围。
        case none = 0
       //自动对焦范围限制在相机附近物体。
        case near = 1
       //自动对焦范围限制在远离相机的拍摄对象
        case far = 2
    }

   /*
  可以作为setFocusModeLockedWithLensPosition:completionHandler:的lensPosition参数传递的特   殊值,以指示调用者不希望为lensPosition属性指定值,而应将其设置为当前值。 请注意,设备可能在调用时正在调整lensPosition,在这种情况下,锁定lensPosition的值可能不同于通过查询lensPosition属性获得的值。
   */
   @available(iOS  8.0, *)
   public  class  let  currentLensPosition: Float
  1. 自动对焦相关属性和方法
extension AVCaptureDevice {

   //是否支持某个对焦模式
    open func isFocusModeSupported(_ focusMode: AVCaptureDevice.FocusMode) -> Bool

     /*
     是否支持AVCaptureLensPositionCurrent以外的镜头位置。
     如果lockingFocusWithCustomLensPositionSupported返回“否”,则只能使用AVCaptureLensPositionCurrent调用setFocusModeLockedWithLensPosition:。 通过任何其他镜头位置将导致异常。
     */
    @available(iOS 10.0, *)
    open var isLockingFocusWithCustomLensPositionSupported: Bool { get }

    //设置对焦方式
    open var focusMode: AVCaptureDevice.FocusMode

    //是否支持感兴趣的焦点。仅当此属性返回YES时,才能设置接收者的focusPointOfInterest属性。
    open var isFocusPointOfInterestSupported: Bool { get }

     /*
     此属性的值是CGPoint,它确定接收者的关注焦点(如果有)。 值(0,0)表示相机应聚焦在图像的左上角,而值(1,1)表示相机应聚焦在右下角。 默认值为(0.5,0.5)。 -setFocusPointOfInterest:如果isFocusPointOfInterestSupported返回NO,则抛出NSInvalidArgumentException。 -setFocusPointOfInterest:如果在未先使用lockForConfiguration:获得对接收者的独占访问权的情况下调用,则抛出NSGenericException。 客户可以通过观察此属性的键值来观察接收者的focusPointOfInterest的自动更改。 请注意,仅设置focusPointOfInterest不会启动焦点操作。 设置focusPointOfInterest之后,调用-setFocusMode:以应用新的兴趣点。
     */
    open var focusPointOfInterest: CGPoint

    /*
    当前是否正在执行焦点扫描以调整焦点。
    此属性的值是BOOL,它指示是否通过焦点扫描自动调整接收者的摄像机焦点,因为其焦点模式是AVCaptureFocusModeAutoFocus或AVCaptureFocusModeContinuousAutoFocus。 客户可以观察此属性的值以确定相机的焦点是否稳定。
    */
    open var isAdjustingFocus: Bool { get }

     //是否支持自动聚焦范围限制。仅当此属性返回YES时,才能设置接收者的autoFocusRangeRestriction属性。
    @available(iOS 7.0, *)
    open var isAutoFocusRangeRestrictionSupported: Bool { get }

   
     /*
     自动对焦系统当前对特定范围的聚焦扫描的限制(如果它支持范围限制)。
     此属性的值是AVCaptureAutoFocusRangeRestriction,指示自动对焦系统应如何限制其焦点扫描。 默认值为AVCaptureAutoFocusRangeRestrictionNone。 -setAutoFocusRangeRestriction:如果isAutoFocusRangeRestrictionSupported返回NO,则抛出NSInvalidArgumentException。 -setAutoFocusRangeRestriction:如果在未先使用lockForConfiguration:获得接收方独占访问权的情况下调用,则抛出NSGenericException。 仅当focusMode属性设置为AVCaptureFocusModeAutoFocus或AVCaptureFocusModeContinuousAutoFocus时,此属性才有效。 请注意,仅设置autoFocusRangeRestriction不会启动聚焦操作。 设置autoFocusRangeRestriction后,请调用-setFocusMode:以应用新的限制。
     */
    @available(iOS 7.0, *)
    open var autoFocusRangeRestriction: AVCaptureDevice.AutoFocusRangeRestriction

     //是否支持平滑的自动对焦。 仅当此属性返回YES时,才能设置接收者的smoothAutoFocusEnabled属性。
    @available(iOS 7.0, *)
    open var isSmoothAutoFocusSupported: Bool { get }

  
   /*
    是否应使用平滑的自动对焦。
    在-isSmoothAutoFocusSupported返回的YES上,并且将smoothAutoFocusEnabled设置为YES的接收器上,当聚焦模式设置为AVCaptureFocusModeAutoFocus或AVCaptureFocusModeContinuousAutoFocus时,将启用平滑自动聚焦。 启用流畅的自动对焦功能适合于动画录制。 平滑的自动对焦速度较慢,并且对视觉的侵入较小。 禁用平滑自动对焦更适合需要快速自动对焦的视频处理。 默认值为“否”。 如果-isSmoothAutoFocusSupported返回NO,则设置此属性将引发NSInvalidArgumentException。 必须先使用lockForConfiguration:锁定接收器以进行配置,然后客户端才能设置此方法,否则将引发NSGenericException。 请注意,单独设置smoothAutoFocusEnabled不会启动聚焦操作。 设置smoothAutoFocusEnabled后,调用-setFocusMode:以应用新的平滑自动对焦模式。
   */
    @available(iOS 7.0, *)
    open var isSmoothAutoFocusEnabled: Bool

     /*
     镜头的对焦位置。
     可能位置的范围是0.0到1.0,其中0.0是镜头可以聚焦的最短距离,而1.0是最远的距离。 请注意,1.0并不代表无限远。 默认值为1.0。 请注意,给定的镜头位置值并不对应于确切的物理距离,也不代表设备之间的一致聚焦距离。 此属性是键值可观察到的。 无论聚焦模式如何,都可以随时读取它,但是只能通过setFocusModeLockedWithLensPosition:completionHandler:进行设置。
     */
    @available(iOS 8.0, *)
    open var lensPosition: Float { get }

    
     /*
     将focusMode设置为AVCaptureFocusModeLocked并将lensPosition锁定为一个显式值。
     
     在将lensPosition设置为指定的值并将focusMode设置为AVCaptureFocusModeLocked时要调用的块。 如果多次调用setFocusModeLockedWithLensPosition:completionHandler :,则将按FIFO顺序调用完成处理程序。 该块接收一个时间戳,该时间戳与已应用所有设置的第一个缓冲区的时间戳匹配。 请注意,时间戳与设备时钟同步,因此在与通过AVCaptureVideoDataOutput传递的缓冲区的时间戳进行比较之前,必须将其转换为主时钟。 如果不需要了解操作的完成,则客户端可以为处理程序参数传递nil。

     这是设置lensPosition的唯一方法。 如果lensPosition设置为不支持的级别,则此方法将引发NSRangeException。 如果在未先使用lockForConfiguration:获得对接收者的独占访问权的情况下调用此方法,则抛出NSGenericException。
     */
    @available(iOS 8.0, *)
    open func setFocusModeLocked(lensPosition: Float, completionHandler handler: ((CMTime) -> Void)? = nil)
}

曝光

  1. 曝光的定义
    @available(iOS 4.0, *)
    public enum ExposureMode : Int {
        //将曝光锁定在其当前值。
        case locked = 0
        //自动调整一次曝光,然后将曝光模式更改为AVCaptureExposureModeLocked。
        case autoExpose = 1
        //在需要时自动调整曝光。
        case continuousAutoExposure = 2
        //仅根据用户提供的ISO,DurationDuration值来调整曝光。
        @available(iOS 8.0, *)
        case custom = 3
    }

    
    /**
       可以将一个特殊值作为setExposureModeCustomWithDuration:ISO:completionHandler:的工期参数传递,以指示调用者不希望为ExposureDuration属性指定值,而应将其设置为当前值。 请注意,设备可能在通话时正在调整ExposureDuration,在这种情况下,设置为ExposureDuration的值可能不同于通过查询ExposureDuration属性获得的值。
     */
    @available(iOS 8.0, *)
    public class let currentExposureDuration: CMTime

    
    /*
    可以作为setExposureModeCustomWithDuration:ISO:completionHandler:的ISO参数传递的特殊值,以指示调用者不希望为ISO属性指定值,而应将其设置为当前值。 请注意,设备可能在通话时正在调整ISO,在这种情况下,设置ISO的值可能不同于通过查询ISO属性获得的值。
     */
    @available(iOS 8.0, *)
    public class let currentISO: Float

    
    /*
    可以作为setExposureTargetBias:completionHandler:的bias参数传递的特殊值,以指示调用者不希望为ExposureTargetBias属性指定值,而应将其设置为当前值。
     */
    @available(iOS 8.0, *)
    public class let currentExposureTargetBias: Float

  1. 曝光的属性和方法
extension AVCaptureDevice {

     // 判断设备是否支持某种曝光模式
    open func isExposureModeSupported(_ exposureMode: AVCaptureDevice.ExposureMode) -> Bool

     /*
     当前曝光模式(如果其具有可调的曝光)。

     此属性的值是AVCaptureExposureMode,它确定接收器的曝光模式(如果它具有可调的曝光)。 -      setExposureMode:如果设置为不受支持的值,则抛出NSInvalidArgumentException(请参见-isExposureModeSupported :)。 -setExposureMode:如果在未先使用lockForConfiguration:获得对接收者的独占访问权的情况下调用,则抛出NSGenericException。使用AVCapturePhotoOutput并在AVCapturePhotoSettings的photoQualityPrioritization属性设置为AVCapturePhotoQualityPrioritizationBalanced或更高的情况下捕获照片时,如果场景太暗以保证某种形式的多图像融合以改善质量,则在暴露照片时,接收器的ISO和暴露持续时间值可能会被覆盖。为确保在AVCaptureExposureModeCustom或AVCaptureExposureModeLocked中接受接收器的ISO和ExposureDuration值时,必须将AVCapturePhotoSettings.photoQualityPrioritization属性设置为AVCapturePhotoQualityPrioritizationSpeed。如果使用不赞成使用的AVCapturePhotoSettings.autoStillImageStabilizationEnabled属性,则适用相同的规则。您必须将其设置为“否”以在照片捕获中保留自定义曝光值。同样,如果您使用的是AVCaptureStillImageOutput,则必须将AutomaticEnablesStillImageStabilizationWhenAvailable设置为NO,以在静态图像捕获中保留自定义曝光值。客户可以通过观察此属性的键值来观察接收者的ExposureMode的自动更改。
     */
    open var exposureMode: AVCaptureDevice.ExposureMode

    /*
        是否支持感兴趣的曝光点。
        仅当此属性返回YES时,才能设置接收者的ExposurePointOfInterest属性。
     */
    open var isExposurePointOfInterestSupported: Bool { get }

    /**
    当前感兴趣的曝光点(如果有)。
    此属性的值是CGPoint,它确定接收器的关注曝光点(如果它具有可调的曝光)。 值(0,0)表示相机应根据图像的左上角调整曝光,而值(1,1)表示相机应根据右下角调整曝光。 默认值为(0.5,0.5)。 -setExposurePointOfInterest:如果isExposurePointOfInterestSupported返回NO,则抛出NSInvalidArgumentException。 -setExposurePointOfInterest:如果在未先使用lockForConfiguration:获得对接收者的独占访问权的情况下调用,则抛出NSGenericException。 请注意,仅设置ExposurePointOfInterest不会启动曝光操作。 设置ExposurePointOfInterest之后,调用-setExposureMode:以应用新的兴趣点。
     */
    open var exposurePointOfInterest: CGPoint

    /**
     自动曝光算法可能使用的最大曝光(积分)时间。
     当将AVCaptureDevice的exposureMode设置为AVCaptureExposureModeAutoExpose或AVCaptureExposureModeContinuousAutoExposure时,自动曝光算法会选择针对当前配置调整的默认最大曝光持续时间,从而在低光图像质量与运动保留之间取得平衡。通过查询或键值观察此属性,可以找出当前正在使用的最大暴露持续时间。您还可以通过将此属性设置为activeFormat.maxExposureDuration和activeFormat.minExposureDuration之间的值来覆盖默认值。如果您越界暴露持续时间,则抛出NSRangeException。将属性设置为kCMTimeInvalid的特殊值可将自动曝光的最大持续时间重置为当前配置的设备默认值。当设备的activeFormat或AVCaptureSession的sessionPreset更改时,此属性将重置为新格式​​或会话预设的默认最大曝光持续时间。
     
        在某些设备上,自动曝光算法会针对给定格式选择不同的最大曝光持续时间,具体取决于您是使用-[AVCaptureSession setSessionPreset:] API还是使用-[AVCaptureDevice setActiveFormat:] API来设置格式。为了确保最大暴露持续时间的统一默认处理,可以将AVCaptureDeviceInput的UnifiedAutoExposureDefaultsEnabled属性设置为YES。
     */
    @available(iOS 12.0, *)
    open var activeMaxExposureDuration: CMTime

    /**
     当前是否正在调整相机曝光。
     此属性的值是BOOL,指示由于接收器的曝光模式是AVCaptureExposureModeAutoExpose或AVCaptureExposureModeContinuousAutoExposure,因此是否正在自动调整接收器的相机曝光。 客户可以观察此属性的值,以确定相机曝光是稳定的还是正在自动调整。
     */
    open var isAdjustingExposure: Bool { get }

    /**
     镜头光圈的大小。
     
    该属性的值是一个浮点数,表示镜头光圈的大小(f值)。
     */
    @available(iOS 8.0, *)
    open var lensAperture: Float { get }

    /**
    曝光发生的时间长度。
    仅支持activeFormat.minExposureDuration和activeFormat.maxExposureDuration之间的曝光持续时间值。 此属性是键值可观察到的。 无论曝光模式如何,都可以随时读取,但只能通过setExposureModeCustomWithDuration:ISO:completionHandler:进行设置。
     */
    @available(iOS 8.0, *)
    open var exposureDuration: CMTime { get }

    /**
     当前的曝光ISO值。
     
     此属性通过应用于信号的增益值来控制传感器对光的敏感度。 仅支持activeFormat.minISO和activeFormat.maxISO之间的ISO值。 较高的值将产生噪点更大的图像。 此属性是键值可观察到的。 无论曝光模式如何,都可以随时读取,但只能通过setExposureModeCustomWithDuration:ISO:completionHandler:进行设置。
     */
    @available(iOS 8.0, *)
    open var iso: Float { get }

    /**
    将ExposureMode设置为AVCaptureExposureModeCustom,并将ExposureDuration和ISO锁定为显式值。
    
     这是设置exposureDuration和ISO的唯一方法。如果ExposureDuration或ISO设置为不受支持的级别,则此方法将引发NSRangeException。如果在未先使用lockForConfiguration:获得对接收者的独占访问权的情况下调用此方法,则抛出NSGenericException。使用AVCapturePhotoOutput捕获照片时,请注意,AVCapturePhotoSettings的photoQualityPrioritization属性默认为AVCapturePhotoQualityPrioritizationBalanced,如果场景足够暗,可以进行某种形式的多图像融合以改善质量,则照片捕获可临时覆盖捕获设备的ISO和ExposureDuration值。 。为确保在AVCaptureExposureModeCustom或AVCaptureExposureModeLocked中接受接收器的ISO和ExposureDuration值时,必须将AVCapturePhotoSettings.photoQualityPrioritization属性设置为AVCapturePhotoQualityPrioritizationSpeed。如果使用不赞成使用的AVCapturePhotoSettings.autoStillImageStabilizationEnabled属性或AVCaptureStillImageOutput.automaticallyEnablesStillImageStabilizationWhenAvailable属性,则适用相同规则。您必须将它们设置为“否”以保留自定义或锁定的曝光设置。
     */
    @available(iOS 8.0, *)
    open func setExposureModeCustom(duration: CMTime, iso ISO: Float, completionHandler handler: ((CMTime) -> Void)? = nil)

    /**
    测光曝光量相对于目标曝光值的偏移量,以EV单位表示。
     此只读属性的值指示当前场景的测得曝光量与目标曝光量之间的差。 此属性是键值可观察到的。
     */
    @available(iOS 8.0, *)
    open var exposureTargetOffset: Float { get }

    /**
    应用于目标曝光值的偏差,以EV单位表示。
     当ExposureMode为AVCaptureExposureModeContinuousAutoExposure或AVCaptureExposureModeLocked时,偏差将影响测光(exposureTargetOffset)和实际曝光水平(exposureDuration和ISO)。 当曝光模式为AVCaptureExposureModeCustom时,它将仅影响测光。 此属性是键值可观察到的。 它可以随时读取,但只能通过setExposureTargetBias:completionHandler:进行设置。
     */
    @available(iOS 8.0, *)
    open var exposureTargetBias: Float { get }

    /*
    浮标,指示最小支持的曝光偏差,以EV单位表示。
     */
    @available(iOS 8.0, *)
    open var minExposureTargetBias: Float { get }

    /*
     浮点数,表示最大支持的曝光偏差,以EV单位表示。
     */
    @available(iOS 8.0, *)
    open var maxExposureTargetBias: Float { get }

    /**
    设置要应用于目标曝光值的偏差。
     这是设置ExposureTargetBias的唯一方法。 如果将ExposureTargetBias设置为不支持的级别,则此方法将引发NSRangeException。 如果在未先使用lockForConfiguration:获得对接收者的独占访问权的情况下调用此方法,则抛出NSGenericException。
     */
    @available(iOS 8.0, *)
    open func setExposureTargetBias(_ bias: Float, completionHandler handler: ((CMTime) -> Void)? = nil)
}

白平衡

  1. 白平衡的定义
  @available(iOS  4.0, *)
  public  enum  WhiteBalanceMode : Int {
      // 白平衡应锁定在其当前值。
      case locked = 0
      //自动调整一次白平衡,然后将白平衡模式更改为AVCaptureWhiteBalanceModeLocked。
      case  autoWhiteBalance = 1
      //在需要时自动调整白平衡。
      case  continuousAutoWhiteBalance = 2
 }


   // 包含RGB白平衡增益值的结构。
  @available(iOS  8.0, *)
  public  struct  WhiteBalanceGains {
        public var redGain: Float
        public var greenGain: Float
        public var blueGain: Float
        public init()
        public init(redGain: Float, greenGain: Float, blueGain: Float)
         }

  //包含CIE 1931 xy色度值的结构。
  @available(iOS  8.0, *)
  public  struct  WhiteBalanceChromaticityValues {
       public var x: Float
       public var y: Float
       public init()
       public init(x: Float, y: Float)
 }

  //包含与白平衡颜色相关的结构,以开尔文为单位的温度,以及介于[-150-+150]范围内的色度值。
  @available(iOS  8.0, *)
  public  struct  WhiteBalanceTemperatureAndTintValues {
      public var temperature: Float
      public var tint: Float
      public init()
      public init(temperature: Float, tint: Float)
 }

 /*
     可以作为setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler:的参    数传递的特殊值,以指示调用者不希望为deviceWhiteBalanceGains指定值,并且应该锁定锁定白平衡时将增益锁定为其值。
     */
  @available(iOS  8.0, *)
  public  class  let  currentWhiteBalanceGains: AVCaptureDevice.WhiteBalanceGains
  1. 白平衡相关的属性和方法
extension AVCaptureDevice {

    //判断是否支持某种白平衡模式
    open func isWhiteBalanceModeSupported(_ whiteBalanceMode: AVCaptureDevice.WhiteBalanceMode) -> Bool

    /**
    是否支持AVCaptureWhiteBalanceGainsCurrent以外的白平衡增益。
    如果lockingWhiteBalanceWithCustomDeviceGainsSupported返回“否”,则只能使用AVCaptureWhiteBalanceGainsCurrent调用setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:。 传递任何其他白平衡增益将导致异常。
     */
    @available(iOS 10.0, *)
    open var isLockingWhiteBalanceWithCustomDeviceGainsSupported: Bool { get }

    /**
    当前的白平衡模式(如果它具有可调的白平衡)。
     
    此属性的值是AVCaptureWhiteBalanceMode,它确定接收器的白平衡模式(如果它具有可调的白平衡)。 -setWhiteBalanceMode:如果设置为不受支持的值,则抛出NSInvalidArgumentException(请参见-isWhiteBalanceModeSupported :)。 -setWhiteBalanceMode:如果在未先使用lockForConfiguration:获得对接收者的独占访问权的情况下调用,则抛出NSGenericException。 客户端可以通过观察此
     */
    open var whiteBalanceMode: AVCaptureDevice.WhiteBalanceMode

    /**
     当前是否正在调整相机白平衡。
     此属性的值是BOOL,它指示是否自动调整接收器的相机白平衡,因为其白平衡模式为AVCaptureWhiteBalanceModeAutoWhiteBalance或AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance。 客户可以观察该属性的值,以确定相机白平衡是稳定的还是正在自动调节。
     */
    open var isAdjustingWhiteBalance: Bool { get }

    /**
     当前使用的特定于设备的RGB白平衡增益值。
     */
    @available(iOS 8.0, *)
    open var deviceWhiteBalanceGains: AVCaptureDevice.WhiteBalanceGains { get }

    /**
     当前使用的特定于设备的“灰世界” RGB白平衡增益值。
     */
    @available(iOS 8.0, *)
    open var grayWorldDeviceWhiteBalanceGains: AVCaptureDevice.WhiteBalanceGains { get }

    /**
     将AVCaptureWhiteBalanceGains中的通道设置为的最大支持值。
     */
    @available(iOS 8.0, *)
    open var maxWhiteBalanceGain: Float { get }

    /**
    使用显式deviceWhiteBalanceGains值将白平衡设置为锁定模式。
    对于whiteBalanceGains结构中的每个通道,仅支持1.0到-maxWhiteBalanceGain之间的值。 增益值标准化为最小通道值以避免亮度变化(例如R:2 G:2 B:4将标准化为R:1 G:1 B:2)。 如果将任何whiteBalanceGains设置为不支持的级别,则此方法将引发NSRangeException。 如果在未先使用lockForConfiguration:获得对接收者的独占访问权的情况下调用此方法,则抛出NSGenericException。
     */
    @available(iOS 8.0, *)
    open func setWhiteBalanceModeLocked(with whiteBalanceGains: AVCaptureDevice.WhiteBalanceGains, completionHandler handler: ((CMTime) -> Void)? = nil)

    /**
     将特定于设备的白平衡RGB增益值转换为与设备无关的色度值。
     
     可以在接收器上调用此方法,以将特定于设备的白平衡RGB增益值转换为与设备无关的色度(x很小,y很小)。 对于whiteBalanceGains结构中的每个通道,仅支持1.0到-maxWhiteBalanceGain之间的值。 如果将任何whiteBalanceGains设置为不支持的值,则此方法将引发NSRangeException。
     */
    @available(iOS 8.0, *)
    open func chromaticityValues(for whiteBalanceGains: AVCaptureDevice.WhiteBalanceGains) -> AVCaptureDevice.WhiteBalanceChromaticityValues

    /**
     将设备无关的色度值转换为设备特定的白平衡RGB增益值。
     可以在接收器上调用此方法,以将与设备无关的色度值转换为特定于设备的RGB白平衡增益值。 如果任何色度值设置在[0,1]范围之外,则此方法将引发NSRangeException。 请注意,某些x,y组合会产生超出范围的设备RGB值,如果将它们直接传递给-setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler :,则会引发异常。 确保检查红色,绿色和蓝色增益值是否在[1.0-maxWhiteBalanceGain]范围内。
     */
    @available(iOS 8.0, *)
    open func deviceWhiteBalanceGains(for chromaticityValues: AVCaptureDevice.WhiteBalanceChromaticityValues) -> AVCaptureDevice.WhiteBalanceGains

    /**
     将特定于设备的白平衡RGB增益值转换为与设备无关的温度和色度值。
       可以在接收器上调用此方法,以将特定于设备的白平衡RGB增益值转换为与设备无关的温度(开尔文)和色度值。 对于whiteBalanceGains结构中的每个通道,仅支持1.0到-maxWhiteBalanceGain之间的值。 如果将任何whiteBalanceGains设置为不支持的值,则此方法将引发NSRangeException。
     */
    @available(iOS 8.0, *)
    open func temperatureAndTintValues(for whiteBalanceGains: AVCaptureDevice.WhiteBalanceGains) -> AVCaptureDevice.WhiteBalanceTemperatureAndTintValues

    /**
     将与设备无关的温度和色调值转换为特定于设备的白平衡RGB增益值。
     
    可以在接收器上调用此方法,以将与设备无关的温度和色度值转换为设备特定的RGB白平衡增益值。 您可以传递任何温度和色度值,并且会产生相应的白平衡增益。 请注意,尽管有些温度和色调组合会产生超出范围的设备RGB值,如果将它们直接传递给-setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler :,则会导致引发异常。 确保检查红色,绿色和蓝色增益值是否在[1.0-maxWhiteBalanceGain]范围内。
     */
    @available(iOS 8.0, *)
    open func deviceWhiteBalanceGains(for tempAndTintValues: AVCaptureDevice.WhiteBalanceTemperatureAndTintValues) -> AVCaptureDevice.WhiteBalanceGains
}
extension AVCaptureDevice {

    /**
     是否应监视主题区域的更改。
     
     此属性的值是BOOL,指示接收器是否应监视视频主题区域的变化(例如灯光变化,大幅运动等)。如果启用了主题区域变化监视,则接收器每当检测到对以下内容的更改时,都会发送AVCaptureDeviceSubjectAreaDidChangeNotification。 主题区域,此时感兴趣的客户可能希望重新聚焦,调整曝光度,白平衡等。必须使用lockForConfiguration:配置客户端锁定接收器,然后客户才能设置此属性的值。
     */
    @available(iOS 5.0, *)
    open var isSubjectAreaChangeMonitoringEnabled: Bool
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271