简介
AVCaptureDevice 一种为捕获会话提供输入(例如音频或视频)并提供针对特定于硬件的捕获功能的控件的设备。是关于硬件的接口,用于配置底层硬件的属性(如对焦,闪光灯,曝光等)。这些底层硬件包括前置摄像头、后置摄像头、麦克风、闪光灯等。使用AVCaptureDevice向AVCaptureSession对象提供输入数据(如音频或视频)。
1. 权限申请
首先应该在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