【iOS】AVCaptureDevice枚举与使用

iOS中拍照与拍摄都需要操作相机,对于相机的相关特性,例如前后切换,对焦,变焦,曝光,白平衡,红眼等特性。借助网友整理的部分,增加了一些说明和使用,同时随着apilevel的升高,部分接口有变化或有新的接口增加,请对照实际的
<AVFCapture/AVCaptureDevice.h>头文件进行调用。

摄像头前置/后置

typedef NS_ENUM(NSInteger, AVCaptureDevicePosition) {
AVCaptureDevicePositionUnspecified = 0, //未指定
AVCaptureDevicePositionBack = 1,//后置
AVCaptureDevicePositionFront = 2,//前置
} API_AVAILABLE(macos(10.7), ios(4.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) __WATCHOS_PROHIBITED;

闪光灯模式

typedef NS_ENUM(NSInteger, AVCaptureFlashMode) {
AVCaptureFlashModeOff = 0, //关
AVCaptureFlashModeOn = 1, //开
AVCaptureFlashModeAuto = 2, //自动
} API_AVAILABLE(macos(10.7), ios(4.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) API_UNAVAILABLE(watchOS);
@property(nonatomic, readonly) BOOL hasFlash;
@property(nonatomic, readonly, getter=isFlashAvailable) BOOL flashAvailable API_AVAILABLE(macos(10.15), ios(5.0), macCatalyst(14.0)) API_UNAVAILABLE(tvOS);

//设置闪光灯模式,<code>10以上用AVCapturePhotoSettings.flashMode</code>
@property(nonatomic) AVCaptureFlashMode flashMode API_DEPRECATED("Use AVCapturePhotoSettings.flashMode instead.", ios(4.0, 10.0)) API_UNAVAILABLE(tvOS);

设置闪光灯模式,10以上用AVCapturePhotoSettings.flashMode

led模式

typedef NS_ENUM(NSInteger, AVCaptureTorchMode) {
AVCaptureTorchModeOff = 0, //关
AVCaptureTorchModeOn = 1, //开
AVCaptureTorchModeAuto = 2, //自动
} API_AVAILABLE(macos(10.7), ios(4.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) __WATCHOS_PROHIBITED;

@property(nonatomic) AVCaptureTorchMode torchMode;

device.torchMode = AVCaptureTorchModeOn

对焦(聚焦)

typedef NS_ENUM(NSInteger, AVCaptureFocusMode) {
AVCaptureFocusModeLocked = 0, //指示焦点应锁定在透镜的当前位置。
AVCaptureFocusModeAutoFocus = 1, //指示设备应该自动对焦一次,然后将对焦模式更改为AVCaptureFocusModeLocked。
AVCaptureFocusModeContinuousAutoFocus = 2, //指示设备在需要时自动对焦。
} API_AVAILABLE(macos(10.7), ios(4.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) __WATCHOS_PROHIBITED;

@property(nonatomic) AVCaptureFocusMode focusMode;

对焦范围

指示接收方自动聚焦系统对特定聚焦扫描范围的限制的常数,如果它支持范围限制。

typedef NS_ENUM(NSInteger, AVCaptureAutoFocusRangeRestriction) {
AVCaptureAutoFocusRangeRestrictionNone = 0, //指示自动对焦系统不应限制对焦范围。
AVCaptureAutoFocusRangeRestrictionNear = 1, //指示自动对焦系统应限制离相机较近的主题物的对焦范围。
AVCaptureAutoFocusRangeRestrictionFar = 2, //表示自动对焦系统应该对距离相机较远的拍摄对象限制对焦范围。
} API_AVAILABLE(ios(7.0), macCatalyst(14.0)) API_UNAVAILABLE(macos, tvos) __WATCHOS_PROHIBITED;

@property(nonatomic) CGPoint focusPointOfInterest;
@property(nonatomic) AVCaptureAutoFocusRangeRestriction autoFocusRangeRestriction

曝光

如果接收设备有可调曝光量,则指示曝光模式的常数。

typedef NS_ENUM(NSInteger, AVCaptureExposureMode) {
AVCaptureExposureModeLocked = 0, //指示应将敞口锁定在其当前值。
AVCaptureExposureModeAutoExpose = 1, //指示设备应该自动调整曝光一次,然后将曝光模式更改为AVCaptureExposureModeLocked。
AVCaptureExposureModeContinuousAutoExposure = 2, //指示设备应在需要时自动调整曝光。
AVCaptureExposureModeCustom API_AVAILABLE(macos(10.15), ios(8.0), macCatalyst(14.0)) = 3, //指示设备只应根据用户提供的ISO、曝光值来调整曝光量。
} API_AVAILABLE(macos(10.7), ios(4.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) __WATCHOS_PROHIBITED;

@property(nonatomic) AVCaptureExposureMode exposureMode;
@property(nonatomic) CGPoint exposurePointOfInterest;

白平衡

如果接收设备有可调白平衡,指示白平衡模式的常数。

typedef NS_ENUM(NSInteger, AVCaptureWhiteBalanceMode) {
AVCaptureWhiteBalanceModeLocked = 0, //指示应将白平衡锁定在其当前值。
AVCaptureWhiteBalanceModeAutoWhiteBalance = 1, //表示设备自动调整白平衡一次,然后将白平衡模式修改为avcapturewhitebalancemodellocked。
AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance = 2, //指示设备在需要时自动调节白平衡。
} API_AVAILABLE(macos(10.7), ios(4.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) __WATCHOS_PROHIBITED;

- (BOOL)isWhiteBalanceModeSupported:(AVCaptureWhiteBalanceMode)whiteBalanceMode;
@property(nonatomic) AVCaptureWhiteBalanceMode whiteBalanceMode;

权限

指示客户端对支持媒体类型的底层硬件的授权的常量。

typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {
AVAuthorizationStatusNotDetermined = 0, //指示用户尚未决定客户机是否可以访问硬件。
AVAuthorizationStatusRestricted = 1,//未授权客户端访问介质类型的硬件。用户无法更改客户端的状态,可能是由于家长控制等活动限制。
AVAuthorizationStatusDenied = 2, //用户明确地拒绝了对支持客户端媒体类型的硬件的访问。
AVAuthorizationStatusAuthorized = 3, //客户端被授权访问支持某种媒体类型的硬件。
} API_AVAILABLE(macos(10.14), ios(7.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) __WATCHOS_PROHIBITED;

回放模式

常量,指示传输控件的当前回放模式(如果有的话)。

typedef NS_ENUM(NSInteger, AVCaptureDeviceTransportControlsPlaybackMode) {
AVCaptureDeviceTransportControlsNotPlayingMode = 0, //指示磁带传输不通过播放头。
AVCaptureDeviceTransportControlsPlayingMode = 1, //指示磁带传输通过播放头进行。
} API_AVAILABLE(macos(10.7)) API_UNAVAILABLE(ios, macCatalyst, watchos, tvOS);

颜色空间

表示活动或支持的视频颜色空间的常量。

typedef NS_ENUM(NSInteger, AVCaptureColorSpace) {
AVCaptureColorSpace_sRGB = 0, //sGRB颜色空间(https://www.w3.org/Graphics/Color/srgb)
AVCaptureColorSpace_P3_D65 = 1,//使用Illuminant D65作为白点的P3 D65宽色空间。
AVCaptureColorSpace_HLG_BT2020 API_AVAILABLE(ios(14.1), macCatalyst(14.1)) API_UNAVAILABLE(macos, tvos) API_UNAVAILABLE(watchos) = 2, //以Illuminant D65为白点,以Hybrid Log-Gamma为传递函数的BT2020宽色空间。
} API_AVAILABLE(macos(10.15), ios(10.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) __WATCHOS_PROHIBITED;

舞台模式

指示当前中央舞台控制模式的常数。

typedef NS_ENUM(NSInteger, AVCaptureCenterStageControlMode) {
AVCaptureCenterStageControlModeUser = 0, //指示应用程序不知道Center Stage特性。它的启用完全由控制中心的用户控制。
AVCaptureCenterStageControlModeApp = 1, //指示应用程序控制Center Stage特性,不允许用户在Control Center中输入。
AVCaptureCenterStageControlModeCooperative = 2, //表示用户和应用程序共同控制Center Stage特性。
} API_AVAILABLE(ios(14.5), macCatalyst(14.5)) API_UNAVAILABLE(macos, tvos) API_UNAVAILABLE(watchOS);

麦克风滤波模式

描述麦克风滤波模式的常数。

typedef NS_ENUM(NSInteger, AVCaptureMicrophoneMode) {
AVCaptureMicrophoneModeStandard = 0, //麦克风音频正在用标准语音DSP处理。
AVCaptureMicrophoneModeWideSpectrum = 1, //表示最小化麦克风音频处理,以捕捉房间内的所有声音。
AVCaptureMicrophoneModeVoiceIsolation = 2, //表示正在处理麦克风音频,以隔离语音,减弱其他信号。
} NS_SWIFT_NAME(AVCaptureDevice.MicrophoneMode) API_AVAILABLE(macos(12.0), ios(15.0), macCatalyst(15.0)) API_UNAVAILABLE(tvos) API_UNAVAILABLE(watchOS);

系统用户界面

可用的系统用户界面+showSystemUserInterface:.

typedef NS_ENUM(NSInteger, AVCaptureSystemUserInterface) {
AVCaptureSystemUserInterfaceVideoEffects = 1, //开启/关闭视频效果的系统界面。
AVCaptureSystemUserInterfaceMicrophoneModes = 2, //选择麦克风模式的系统界面。
} NS_SWIFT_NAME(AVCaptureDevice.SystemUserInterface) API_AVAILABLE(macos(12.0), ios(15.0), macCatalyst(15.0)) API_UNAVAILABLE(tvos) API_UNAVAILABLE(watchOS);

支持的视频稳定模式

表示设备格式支持的视频稳定模式的常量。

typedef NS_ENUM(NSInteger, AVCaptureVideoStabilizationMode) {
AVCaptureVideoStabilizationModeOff = 0, //表示视频不应该稳定。
AVCaptureVideoStabilizationModeStandard = 1, //表示使用iOS 5.0中引入的标准视频稳定算法来稳定视频。标准的视频稳定器具有缩小的视场。启用视频稳定可能会在视频捕获管道中引入额外的延迟。
AVCaptureVideoStabilizationModeCinematic = 2, //表明视频应该稳定使用电影稳定算法更戏剧性的结果。与标准视频稳定器相比,电影视频稳定器具有缩小的视场。与标准视频稳定化相比,启用电影视频稳定化会在视频捕获管道中引入更多的延迟,并且会消耗更多的系统内存。在这种模式下使用窄的或相同的最小和最大帧持续时间。
AVCaptureVideoStabilizationModeCinematicExtended API_AVAILABLE(ios(13.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) API_UNAVAILABLE(watchos) = 3, //表示视频应该使用扩展电影稳定化算法来稳定。与AVCaptureVideoStabilizationModeCinematic相比,启用扩展的电影稳定化会给视频捕捉管道带来更长的延迟,消耗更多内存,但提高了稳定性。在这种模式下,建议使用相同或相似的最小和最大帧长。
AVCaptureVideoStabilizationModeAuto = -1, //表示为设备选择最合适的视频稳定模式和格式。
} API_AVAILABLE(ios(8.0), macCatalyst(14.0)) API_UNAVAILABLE(macos, tvos) __WATCHOS_PROHIBITED;

自动对焦系统

指示自动对焦系统的常数。

typedef NS_ENUM(NSInteger, AVCaptureAutoFocusSystem) {
AVCaptureAutoFocusSystemNone = 0, //指示无法使用自动对焦。
AVCaptureAutoFocusSystemContrastDetection = 1, //表示通过对比度检测实现自动对焦。对比检测执行焦点扫描,以找到最佳位置。
AVCaptureAutoFocusSystemPhaseDetection = 2, //表示通过相位检测实现自动对焦。相位检测在许多情况下无需聚焦扫描就能实现聚焦。相位检测自动对焦通常比对比度检测自动对焦对视觉的干扰小。
} API_AVAILABLE(macos(10.15), ios(8.0), macCatalyst(14.0)) API_UNAVAILABLE(tvos) __WATCHOS_PROHIBITED;

虚拟设备

可用于控制何时允许虚拟设备切换活动的主组成设备。
具有多个组成视频设备的虚拟设备(如Dual Camera、Dual Wide Camera或Triple Camera),由每个具有不同属性的相机组成,如焦距、最大光敏度和最小聚焦距离。选择其中一个组成视频设备作为主要组成设备。对于AVCaptureSession,主要组成设备产生所有输出。对于AVCaptureMultiCamSession,主要组成设备产生连接到虚拟设备本地AVCaptureDeviceInputPort的所有输出(其中它的sourceDeviceType等于虚拟设备的deviceType)。
当请求的变焦系数可以由多个组成摄像机实现时(参见-virtualDeviceSwitchOverVideoZoomFactors),虚拟设备为场景选择最佳摄像机。其主要条件是焦距;具有最长焦距的相机需要最少的数字缩放,因此通常提供最高的图像质量。次要条件是聚焦和曝光;当场景需要聚焦或曝光超出主动主成分设备的限制时,一个较短焦距的相机可能能够提供更好的质量的图像。这样的设备称为后备主组件设备。例如,一个最小焦距为40cm的长焦相机,当场景中的对象接近40cm时,就无法提供清晰的图像。对于这样的场景,虚拟设备将切换到广角相机,通常有一个较小的最小焦距,能够实现对主题的精确聚焦。在这种情况下,广角相机是后备的主要组成设备。

typedef NS_ENUM(NSInteger, AVCapturePrimaryConstituentDeviceSwitchingBehavior) {
AVCapturePrimaryConstituentDeviceSwitchingBehaviorUnsupported = 0, //表示该设备不支持组成设备交换。这对于没有一个以上组成设备的相机是有报告的。
AVCapturePrimaryConstituentDeviceSwitchingBehaviorAuto = 1, //自动选择当前场景的最佳相机。在这种模式下,没有限制,可开关相机。
AVCapturePrimaryConstituentDeviceSwitchingBehaviorRestricted = 2, //限制回缩摄像头的选择到特定的条件(参见avcaptureprimarycontentdevicerestrictedswitchingbehaviorconditions)。相机开关,以满足要求的视频变焦系数仍然允许没有限制。
AVCapturePrimaryConstituentDeviceSwitchingBehaviorLocked = 3, //锁定摄像头切换到主动主成分设备。注意,这将minAvailableVideoZoomFactor限制为activeprimarycontentdevice的切换缩放因子(在AVCaptureDevice.virtualDeviceSwitchOverVideoZoomFactors中报告)。
} NS_SWIFT_NAME(AVCaptureDevice.PrimaryConstituentDeviceSwitchingBehavior) API_AVAILABLE(macos(12.0), ios(15.0), macCatalyst(15.0)) API_UNAVAILABLE(tvos) API_UNAVAILABLE(watchOS);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS Objective-C 中可以使用系统提供的 Core Image 框架来实现人脸拍照功能。具体步骤如下: 1. 导入 Core Image 框架: ``` #import <CoreImage/CoreImage.h> ``` 2. 创建 AVCaptureSession 实例: ``` AVCaptureSession *session = [[AVCaptureSession alloc] init]; session.sessionPreset = AVCaptureSessionPresetPhoto; ``` 3. 创建 AVCaptureDevice 实例: ``` AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; ``` 4. 创建 AVCaptureDeviceInput 实例: ``` AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; [session addInput:input]; ``` 5. 创建 AVCaptureStillImageOutput 实例: ``` AVCaptureStillImageOutput *output = [[AVCaptureStillImageOutput alloc] init]; NSDictionary *outputSettings = @{AVVideoCodecKey: AVVideoCodecJPEG}; [output setOutputSettings:outputSettings]; [session addOutput:output]; ``` 6. 创建 AVCaptureVideoPreviewLayer 实例: ``` AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; previewLayer.frame = self.view.bounds; [self.view.layer addSublayer:previewLayer]; [session startRunning]; ``` 7. 拍照并获取人脸: ``` AVCaptureConnection *connection = [output connectionWithMediaType:AVMediaTypeVideo]; [output captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { UIImage *image = [UIImage imageWithData:[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]]; CIImage *ciImage = [[CIImage alloc] initWithImage:image]; NSDictionary *options = @{CIDetectorAccuracy: CIDetectorAccuracyHigh}; CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:options]; NSArray *features = [detector featuresInImage:ciImage]; for (CIFaceFeature *feature in features) { if (feature.hasLeftEyePosition && feature.hasRightEyePosition && feature.hasMouthPosition) { // 人脸拍照成功,可以在这里处理拍照后的操作 } } }]; ``` 以上是一个简单的人脸拍照功能的实现方法,你可以根据实际需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值