iOS AVCaptureDevice

簡介

AVCaptureDevice 一種為捕獲會話提供輸入(例如音頻或視頻)并提供針對特定于硬件的捕獲功能的控件的設備魁兼。是關于硬件的接口能耻,用于配置底層硬件的屬性(如對焦,閃光燈,曝光等)愚争。這些底層硬件包括前置攝像頭、后置攝像頭挤聘、麥克風轰枝、閃光燈等。使用****AVCaptureDevice****向****AVCaptureSession****對象提供輸入數(shù)據(jù)(如音頻或視頻)组去。

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
    //不允許用戶訪問媒體捕獲設備。這個狀態(tài)通常是看不到的:用于發(fā)現(xiàn)設備的`AVCaptureDevice`類方法不會返回用戶被限制訪問的設備从隆。
    case restricted = 1
    //用戶已經(jīng)明確拒絕了應用訪問捕獲設備
    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]

推薦使用的方法

// 此方法返回系統(tǒng)上當前可用的給定媒體類型的默認設備诚撵。
open class func `default`(for mediaType: AVMediaType) -> AVCaptureDevice?
/*
根據(jù)uniqueID 初始化 (可以通過實例的uniqueID屬性獲取)
每臺可用的捕獲設備都有一個唯一的ID键闺,該ID會在設備連接和斷開連接寿烟,應用程序重新啟動以及系統(tǒng)本身重新啟動后一直存在于一個系統(tǒng)上。 此方法可用于調用或跟蹤先前已保存唯一ID的特定設備的狀態(tài)辛燥。
*/ 
public /*not inherited*/ init?(uniqueID deviceUniqueID: String)

使用 AVCaptureDeviceDiscoverySession 獲取AVCaptureDevice

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

//通過這個參數(shù)獲取可用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 相機和其他傳感器的組合辉懒,可創(chuàng)建能夠進行照片,視頻和深度捕捉的捕捉設備谍失。
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 當現(xiàn)有設備不可用時發(fā)送一個通知颠印,通知對象是AVCaptureDevice實例,表示不可用的設備抹竹。
AVCaptureDeviceSubjectAreaDidChange AVCaptureDevice實例檢測到視頻主題區(qū)域發(fā)生了實質性變化线罕。 僅當您首先將subjectAreaChangeMonitoringEnabled設置為YES時,才發(fā)送此通知窃判。
//可用通過 AVCaptureDevice的isConnected 判斷指示設備是否已連接并且對系統(tǒng)可用钞楼。
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
       //表示應根據(jù)環(huán)境光線條件自動使用閃光燈嘿辟。
        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
    //指示應根據(jù)環(huán)境光線條件自動使用手電筒堤舒。
    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設備太熱色建,則指定的值可能不可用 此方法在指定級別將割炬模式設置為
      在手電筒開啟狀態(tài)修改亮度 需要 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參數(shù)傳遞的特   殊值,以指示調用者不希望為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

    /*
    當前是否正在執(zhí)行焦點掃描以調整焦點充甚。
    此屬性的值是BOOL,它指示是否通過焦點掃描自動調整接收者的攝像機焦點霸褒,因為其焦點模式是AVCaptureFocusModeAutoFocus或AVCaptureFocusModeContinuousAutoFocus伴找。 客戶可以觀察此屬性的值以確定相機的焦點是否穩(wěn)定。
    */
    open var isAdjustingFocus: Bool { get }

     //是否支持自動聚焦范圍限制废菱。僅當此屬性返回YES時技矮,才能設置接收者的autoFocusRangeRestriction屬性抖誉。
    @available(iOS 7.0, *)
    open var isAutoFocusRangeRestrictionSupported: Bool { get }

   
     /*
     自動對焦系統(tǒng)當前對特定范圍的聚焦掃描的限制(如果它支持范圍限制)。
     此屬性的值是AVCaptureAutoFocusRangeRestriction衰倦,指示自動對焦系統(tǒng)應如何限制其焦點掃描袒炉。 默認值為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,則設置此屬性將引發(fā)NSInvalidArgumentException问拘。 必須先使用lockForConfiguration:鎖定接收器以進行配置遍略,然后客戶端才能設置此方法,否則將引發(fā)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順序調用完成處理程序。 該塊接收一個時間戳礁鲁,該時間戳與已應用所有設置的第一個緩沖區(qū)的時間戳匹配盐欺。 請注意,時間戳與設備時鐘同步仅醇,因此在與通過AVCaptureVideoDataOutput傳遞的緩沖區(qū)的時間戳進行比較之前冗美,必須將其轉換為主時鐘。 如果不需要了解操作的完成析二,則客戶端可以為處理程序參數(shù)傳遞nil粉洼。

     這是設置lensPosition的唯一方法。 如果lensPosition設置為不支持的級別叶摄,則此方法將引發(fā)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
        //僅根據(jù)用戶提供的ISO愉棱,DurationDuration值來調整曝光唆铐。
        @available(iOS 8.0, *)
        case custom = 3
    }

    
    /**
       可以將一個特殊值作為setExposureModeCustomWithDuration:ISO:completionHandler:的工期參數(shù)傳遞,以指示調用者不希望為ExposureDuration屬性指定值奔滑,而應將其設置為當前值艾岂。 請注意,設備可能在通話時正在調整ExposureDuration朋其,在這種情況下王浴,設置為ExposureDuration的值可能不同于通過查詢ExposureDuration屬性獲得的值脆炎。
     */
    @available(iOS 8.0, *)
    public class let currentExposureDuration: CMTime

    
    /*
    可以作為setExposureModeCustomWithDuration:ISO:completionHandler:的ISO參數(shù)傳遞的特殊值,以指示調用者不希望為ISO屬性指定值氓辣,而應將其設置為當前值秒裕。 請注意,設備可能在通話時正在調整ISO钞啸,在這種情況下几蜻,設置ISO的值可能不同于通過查詢ISO屬性獲得的值。
     */
    @available(iOS 8.0, *)
    public class let currentISO: Float

    
    /*
    可以作為setExposureTargetBias:completionHandler:的bias參數(shù)傳遞的特殊值体斩,以指示調用者不希望為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和暴露持續(xù)時間值可能會被覆蓋幔崖。為確保在AVCaptureExposureModeCustom或AVCaptureExposureModeLocked中接受接收器的ISO和ExposureDuration值時,必須將AVCapturePhotoSettings.photoQualityPrioritization屬性設置為AVCapturePhotoQualityPrioritizationSpeed渣淤。如果使用不贊成使用的AVCapturePhotoSettings.autoStillImageStabilizationEnabled屬性赏寇,則適用相同的規(guī)則。您必須將其設置為“否”以在照片捕獲中保留自定義曝光值价认。同樣嗅定,如果您使用的是AVCaptureStillImageOutput,則必須將AutomaticEnablesStillImageStabilizationWhenAvailable設置為NO用踩,以在靜態(tài)圖像捕獲中保留自定義曝光值渠退。客戶可以通過觀察此屬性的鍵值來觀察接收者的ExposureMode的自動更改脐彩。
     */
    open var exposureMode: AVCaptureDevice.ExposureMode

    /*
        是否支持感興趣的曝光點碎乃。
        僅當此屬性返回YES時,才能設置接收者的ExposurePointOfInterest屬性惠奸。
     */
    open var isExposurePointOfInterestSupported: Bool { get }

    /**
    當前感興趣的曝光點(如果有)梅誓。
    此屬性的值是CGPoint,它確定接收器的關注曝光點(如果它具有可調的曝光)。 值(0,0)表示相機應根據(jù)圖像的左上角調整曝光梗掰,而值(1,1)表示相機應根據(jù)右下角調整曝光嵌言。 默認值為(0.5,0.5)。 -setExposurePointOfInterest:如果isExposurePointOfInterestSupported返回NO及穗,則拋出NSInvalidArgumentException摧茴。 -setExposurePointOfInterest:如果在未先使用lockForConfiguration:獲得對接收者的獨占訪問權的情況下調用,則拋出NSGenericException埂陆。 請注意蓬蝶,僅設置ExposurePointOfInterest不會啟動曝光操作。 設置ExposurePointOfInterest之后猜惋,調用-setExposureMode:以應用新的興趣點丸氛。
     */
    open var exposurePointOfInterest: CGPoint

    /**
     自動曝光算法可能使用的最大曝光(積分)時間。
     當將AVCaptureDevice的exposureMode設置為AVCaptureExposureModeAutoExpose或AVCaptureExposureModeContinuousAutoExposure時著摔,自動曝光算法會選擇針對當前配置調整的默認最大曝光持續(xù)時間缓窜,從而在低光圖像質量與運動保留之間取得平衡。通過查詢或鍵值觀察此屬性谍咆,可以找出當前正在使用的最大暴露持續(xù)時間禾锤。您還可以通過將此屬性設置為activeFormat.maxExposureDuration和activeFormat.minExposureDuration之間的值來覆蓋默認值。如果您越界暴露持續(xù)時間摹察,則拋出NSRangeException恩掷。將屬性設置為kCMTimeInvalid的特殊值可將自動曝光的最大持續(xù)時間重置為當前配置的設備默認值。當設備的activeFormat或AVCaptureSession的sessionPreset更改時供嚎,此屬性將重置為新格式??或會話預設的默認最大曝光持續(xù)時間黄娘。
     
        在某些設備上,自動曝光算法會針對給定格式選擇不同的最大曝光持續(xù)時間克滴,具體取決于您是使用-[AVCaptureSession setSessionPreset:] API還是使用-[AVCaptureDevice setActiveFormat:] API來設置格式逼争。為了確保最大暴露持續(xù)時間的統(tǒng)一默認處理,可以將AVCaptureDeviceInput的UnifiedAutoExposureDefaultsEnabled屬性設置為YES劝赔。
     */
    @available(iOS 12.0, *)
    open var activeMaxExposureDuration: CMTime

    /**
     當前是否正在調整相機曝光誓焦。
     此屬性的值是BOOL,指示由于接收器的曝光模式是AVCaptureExposureModeAutoExpose或AVCaptureExposureModeContinuousAutoExposure着帽,因此是否正在自動調整接收器的相機曝光杂伟。 客戶可以觀察此屬性的值,以確定相機曝光是穩(wěn)定的還是正在自動調整仍翰。
     */
    open var isAdjustingExposure: Bool { get }

    /**
     鏡頭光圈的大小赫粥。
     
    該屬性的值是一個浮點數(shù),表示鏡頭光圈的大星副浮(f值)傅是。
     */
    @available(iOS 8.0, *)
    open var lensAperture: Float { get }

    /**
    曝光發(fā)生的時間長度匪燕。
    僅支持activeFormat.minExposureDuration和activeFormat.maxExposureDuration之間的曝光持續(xù)時間值蕾羊。 此屬性是鍵值可觀察到的喧笔。 無論曝光模式如何,都可以隨時讀取龟再,但只能通過setExposureModeCustomWithDuration:ISO:completionHandler:進行設置书闸。
     */
    @available(iOS 8.0, *)
    open var exposureDuration: CMTime { get }

    /**
     當前的曝光ISO值。
     
     此屬性通過應用于信號的增益值來控制傳感器對光的敏感度利凑。 僅支持activeFormat.minISO和activeFormat.maxISO之間的ISO值浆劲。 較高的值將產(chǎn)生噪點更大的圖像。 此屬性是鍵值可觀察到的哀澈。 無論曝光模式如何牌借,都可以隨時讀取,但只能通過setExposureModeCustomWithDuration:ISO:completionHandler:進行設置割按。
     */
    @available(iOS 8.0, *)
    open var iso: Float { get }

    /**
    將ExposureMode設置為AVCaptureExposureModeCustom膨报,并將ExposureDuration和ISO鎖定為顯式值。
    
     這是設置exposureDuration和ISO的唯一方法适荣。如果ExposureDuration或ISO設置為不受支持的級別现柠,則此方法將引發(fā)NSRangeException。如果在未先使用lockForConfiguration:獲得對接收者的獨占訪問權的情況下調用此方法弛矛,則拋出NSGenericException够吩。使用AVCapturePhotoOutput捕獲照片時,請注意丈氓,AVCapturePhotoSettings的photoQualityPrioritization屬性默認為AVCapturePhotoQualityPrioritizationBalanced周循,如果場景足夠暗,可以進行某種形式的多圖像融合以改善質量万俗,則照片捕獲可臨時覆蓋捕獲設備的ISO和ExposureDuration值鱼鼓。 。為確保在AVCaptureExposureModeCustom或AVCaptureExposureModeLocked中接受接收器的ISO和ExposureDuration值時该编,必須將AVCapturePhotoSettings.photoQualityPrioritization屬性設置為AVCapturePhotoQualityPrioritizationSpeed迄本。如果使用不贊成使用的AVCapturePhotoSettings.autoStillImageStabilizationEnabled屬性或AVCaptureStillImageOutput.automaticallyEnablesStillImageStabilizationWhenAvailable屬性,則適用相同規(guī)則课竣。您必須將它們設置為“否”以保留自定義或鎖定的曝光設置嘉赎。
     */
    @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 }

    /*
     浮點數(shù)零渐,表示最大支持的曝光偏差,以EV單位表示诵盼。
     */
    @available(iOS 8.0, *)
    open var maxExposureTargetBias: Float { get }

    /**
    設置要應用于目標曝光值的偏差。
     這是設置ExposureTargetBias的唯一方法拦耐。 如果將ExposureTargetBias設置為不支持的級別,則此方法將引發(fā)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:的參    數(shù)傳遞的特殊值太示,以指示調用者不希望為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。 客戶可以觀察該屬性的值翅楼,以確定相機白平衡是穩(wěn)定的還是正在自動調節(jié)尉剩。
     */
    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設置為不支持的級別揭芍,則此方法將引發(fā)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設置為不支持的值埃儿,則此方法將引發(fā)NSRangeException蝌箍。
     */
    @available(iOS 8.0, *)
    open func chromaticityValues(for whiteBalanceGains: AVCaptureDevice.WhiteBalanceGains) -> AVCaptureDevice.WhiteBalanceChromaticityValues

    /**
     將設備無關的色度值轉換為設備特定的白平衡RGB增益值妓盲。
     可以在接收器上調用此方法悯衬,以將與設備無關的色度值轉換為特定于設備的RGB白平衡增益值筋粗。 如果任何色度值設置在[0,1]范圍之外,則此方法將引發(fā)NSRangeException丽已。 請注意沛婴,某些x嘁灯,y組合會產(chǎn)生超出范圍的設備RGB值丑婿,如果將它們直接傳遞給-setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler :羹奉,則會引發(fā)異常。 確保檢查紅色滩褥,綠色和藍色增益值是否在[1.0-maxWhiteBalanceGain]范圍內。
     */
    @available(iOS 8.0, *)
    open func deviceWhiteBalanceGains(for chromaticityValues: AVCaptureDevice.WhiteBalanceChromaticityValues) -> AVCaptureDevice.WhiteBalanceGains

    /**
     將特定于設備的白平衡RGB增益值轉換為與設備無關的溫度和色度值俗孝。
       可以在接收器上調用此方法赋铝,以將特定于設備的白平衡RGB增益值轉換為與設備無關的溫度(開爾文)和色度值沽瘦。 對于whiteBalanceGains結構中的每個通道析恋,僅支持1.0到-maxWhiteBalanceGain之間的值。 如果將任何whiteBalanceGains設置為不支持的值筑凫,則此方法將引發(fā)NSRangeException巍实。
     */
    @available(iOS 8.0, *)
    open func temperatureAndTintValues(for whiteBalanceGains: AVCaptureDevice.WhiteBalanceGains) -> AVCaptureDevice.WhiteBalanceTemperatureAndTintValues

    /**
     將與設備無關的溫度和色調值轉換為特定于設備的白平衡RGB增益值棚潦。
     
    可以在接收器上調用此方法瓦盛,以將與設備無關的溫度和色度值轉換為設備特定的RGB白平衡增益值。 您可以傳遞任何溫度和色度值原环,并且會產(chǎn)生相應的白平衡增益嘱吗。 請注意谒麦,盡管有些溫度和色調組合會產(chǎn)生超出范圍的設備RGB值,如果將它們直接傳遞給-setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler :患膛,則會導致引發(fā)異常踪蹬。 確保檢查紅色跃捣,綠色和藍色增益值是否在[1.0-maxWhiteBalanceGain]范圍內疚漆。
     */
    @available(iOS 8.0, *)
    open func deviceWhiteBalanceGains(for tempAndTintValues: AVCaptureDevice.WhiteBalanceTemperatureAndTintValues) -> AVCaptureDevice.WhiteBalanceGains
}
extension AVCaptureDevice {

    /**
     是否應監(jiān)視主題區(qū)域的更改娶聘。
     
     此屬性的值是BOOL丸升,指示接收器是否應監(jiān)視視頻主題區(qū)域的變化(例如燈光變化宦焦,大幅運動等)波闹。如果啟用了主題區(qū)域變化監(jiān)視精堕,則接收器每當檢測到對以下內容的更改時歹篓,都會發(fā)送AVCaptureDeviceSubjectAreaDidChangeNotification。 主題區(qū)域背捌,此時感興趣的客戶可能希望重新聚焦坑赡,調整曝光度么抗,白平衡等蝇刀。必須使用lockForConfiguration:配置客戶端鎖定接收器,然后客戶才能設置此屬性的值捆探。
     */
    @available(iOS 5.0, *)
    open var isSubjectAreaChangeMonitoringEnabled: Bool
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末施蜜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翻默,更是在濱河造成了極大的恐慌修械,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹦渣,居然都是意外死亡认臊,警方通過查閱死者的電腦和手機锄奢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來书在,“玉大人蕊温,你說我怎么就攤上這事义矛×狗” “怎么了制轰?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長调俘。 經(jīng)常有香客問我旺垒,道長先蒋,這世上最難降的妖魔是什么竞漾? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任鳞仙,我火速辦了婚禮叨襟,結果婚禮上,老公的妹妹穿的比我還像新娘爹梁。我一直安慰自己姚垃,他們只是感情好积糯,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跨嘉,像睡著了一般梦重。 火紅的嫁衣襯著肌膚如雪亮瓷。 梳的紋絲不亂的頭發(fā)上嘱支,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天蚓胸,我揣著相機與錄音,去河邊找鬼斗塘。 笑死赢织,一個胖子當著我的面吹牛亮靴,可吹牛的內容都是我干的馍盟。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼茧吊,長吁一口氣:“原來是場噩夢啊……” “哼贞岭!你這毒婦竟也來了?” 一聲冷哼從身側響起搓侄,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廓俭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡仰楚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年捂襟,在試婚紗的時候發(fā)現(xiàn)自己被綠了宠漩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡盼铁,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情瀑构,我是刑警寧澤呻征,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布攒岛,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骆捧,春花似錦枫攀、人聲如沸启盛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拍冠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栖博,地道東北人公你。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像疑枯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子桃漾,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361