iOS AVCaptureDevice介紹

簡介

AVCaptureDevice 一種爲捕獲會話提供輸入(例如音頻或視頻)並提供針對特定於硬件的捕獲功能的控件的設備。是關於硬件的接口,用於配置底層硬件的屬性(如對焦,閃光燈,曝光等)。這些底層硬件包括前置攝像頭、後置攝像頭、麥克風、閃光燈等。使用AVCaptureDeviceAVCaptureSession對象提供輸入數據(如音頻或視頻)。

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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章