OC之AVCaptureDevice
11、管理感光度 ISO
11.1、什么是感光度 ISO
在数码相机中 ISO 表示感光元件的感光的速度。感光度 ISO 数值越高就说明该感光元器件的感光能力越强,对曝光量的要求就越少。一般情况下,ISO 值越低,相片的质量越高,相片的细节表现的得越细腻;ISO 值越高,相片的亮度就越高,而相片的质量会随着 ISO值的升高而降低,噪点会变得越来越严重,但高 ISO 值可以弥补光线的不足。
11.2、获取AVCaptureDevice
的感光度ISO
@property(nonatomic, readonly) float ISO;
当前曝光的感光度 ISO
值。此属性通过应用于信号的增益值返回传感器对光的灵敏度。
仅支持minISO
和maxISO
之间的ISO
值;值越高,图像越嘈杂。
无论曝光模式如何,都可以随时读取属性值,但只能使用-setExposureModeCustomWithDuration:ISO:completionHandler:
方法进行设置。
常量const float AVCaptureISOCurrent;
表示调用者不希望为 ISO
属性指定值,而是应将其设置为其当前值。
12、曝光设置
12.1、关于相机的一些概念
12.1.1、光圈
光圈是一个用来控制光线透过镜头,进入机身内感光面的光量的装置;它通常是在镜头内。
表达光圈大小我们是用F值:光圈F值 = 镜头的焦距/镜头口径的直径;从以上的公式可知要达到相同的光圈F值,长焦距镜头的口径要比短焦距镜头的口径大。当光圈物理孔径不变时,镜头中心与感光器件距离愈远,F数愈大,反之,镜头中心与感光器件距离愈近,通过光孔到达感光器件的光密度愈高,F数就愈小。
完整的光圈值系列如下: F1, F1.4, F2, F2.8, F4, F5.6, F8, F11, F16, F22, F32, F44, F64。
光圈F值愈小,在同一单位时间内的进光量便愈多,而且上一级的进光量刚是下一级的一倍,例如光圈从F8调整到F5.6,进光量便多一倍,我们也说光圈开大了一级。
12.1.2、快门
快门是照相机用来控制感光片有效曝光时间的装置。是照相机的一个重要组成部分,它的结构、形式及功能是衡量照相机档次的一个重要因素。一般而言快门的时间范围越大越好。秒数低适合拍运动中的物体,某款相机就强调快门最快能到1/16000秒,可轻松抓住急速移动的目标。不过当你要拍的是夜晚的车水马龙,快门时间就要拉长,常见照片中丝绢般的水流效果也要用慢速快门才能拍出来。
快门速度单位是“秒”。专业135相机的最高快门速度达到1/16000秒。常见的快门速度有:1 1/2 1/4 1/8 1/15 1/30 1/60 1/125 1/250 1/500 1/1000 1/2000等。相邻两级的快门速度的曝光量相差一倍,我们常说相差一级。如1/60秒比1/125秒的曝光量多一倍,即1/60秒比1/125秒速度慢一级或称低一级。
12.1.3、曝光
曝光:是指当你按相机快门按钮的时候,快门(镜头外的世界和机身内部感光元件之间的门)会打开,过一段时间再关上;就在这一小段时间之内,光线会从镜头钻进来,照在长方形的感光元件上边,感光元件上几千万的感光点就会记录照到它上边的光的色彩;于是,就得到一张照片了。
曝光就是 光圈、快门 和 感光度ISO 的组合。
曝光值 是由快门速度值和光圈值组合表示摄影镜头通光能力的一个数值。
可以这样认为:光圈值大小其实就是那个小圆窗户开多大;快门(速度)就是窗户打开多久。
假设窗户只打开1/4,时间为4秒钟可以正确曝光的话,很显然,窗户打开一半,时间2秒钟也能让底片正确曝光,因为 1/44 = 1/22 = 1,进光量都是一样多。同样的,如果窗户全开,曝光时间就只需要1秒了。
假若一个镜头光圈全开为 F4,用摄影行话来说,光圈 F4 快门速度 1 秒为正确曝光值,那 F5.6 和 2 秒以及 F8 和 4 秒也同样能得到准确曝光的图片。
一张正确曝光的图片可以有N种不同的光圈和快门速度组合。
12.1.4、曝光的兴趣点
兴趣点,又被称为点特征,指的是图像中具有特殊性质的像素点,是图像的重要特征。它具有旋转不变性和不随光照条件变化的优点。这类点被大量用于解决物体识别,图像匹配,视觉跟踪,三维重建等问题。
12.2、曝光的一些属性
属性 | 类型 | 描述 |
---|---|---|
exposureDuration |
CMTime |
一个只读属性,表示曝光时间;仅支持minExposureDuration 和maxExposureDuration 之间的曝光持续时间值。无论曝光模式如何,都可以随时读取曝光时间。 |
exposureTargetOffset |
float |
一个只读属性,表示当前场景的计量曝光水平与目标曝光值之间的差异;以EV为单位。 |
exposureTargetBias |
float |
一个只读属性,以EV单位应用于目标暴露值的偏差。当曝光模式为AVCaptureExposureModeAutoExpose 或AVCaptureExposureModeLocked 时,偏差将影响测光(exposureTargetOffset )和实际曝光等级:曝光时间exposureDuration 和感光度ISO 。 当曝光模式为AVCaptureExposureModeCustom 时,它只会影响测光。 |
minExposureTargetBias |
float |
一个只读属性,EV单位支持的最小曝光偏差。 |
maxExposureTargetBias |
float |
一个只读属性,以EV为单位的最大支持曝光偏差。 |
activeMaxExposureDuration |
CMTime |
自动曝光算法中定义的最长曝光持续时间(以秒为单位)。 |
adjustingExposure |
BOOL |
一个只读属性,指示设备当前是否正在调整其曝光设置。 |
exposureMode |
AVCaptureExposureMode |
设备的曝光模式。在更改此属性的值之前,必须调用-lockForConfiguration: 以锁定AVCaptureDevice ;否则,设置此属性的值会引发异常。完成配置设备后,请调用-unlockForConfiguration 以释放锁定并允许其他设备配置设置。 |
exposurePointOfInterestSupported |
BOOL |
一个只读属性,指示设备是否支持曝光的兴趣点。 |
exposurePointOfInterest |
CGPoint |
曝光的兴趣点。 |
12.2.1、关于activeMaxExposureDuration
属性
在AVCaptureSession
设置sessionPreset
或在AVCaptureDevice
上选择其他activeFormat
时,可以查询或观察对activeMaxExposureDuration
的更改。
可以随时覆盖此属性,以及activeFormat
属性的minExposureDuration
和maxExposureDuration
范围中的任何值。会话运行时会立即反映更改,而不会重建图形。
还可以将属性设置为kCMTimeInvalid
以返回默认值。例如,如果想要比帧速率更短的曝光,则可以覆盖自动曝光算法的最大曝光持续时间。 如果需要通过暴露1/40秒但仍然每秒捕获30帧来冻结运动,则需要手动覆盖。
12.2.2、关于曝光模式AVCaptureExposureMode
AVCaptureExposureMode 用于指定AVCaptureDevice
曝光模式的枚举。
枚举值 | 描述 |
---|---|
AVCaptureExposureModeLocked |
曝光设置已锁定。 |
AVCaptureExposureModeAutoExpose |
设备会自动调整曝光一次,然后将曝光模式更改为AVCaptureExposureModeLocked |
AVCaptureExposureModeContinuousAutoExposure |
设备会持续监控曝光量并在必要时自动曝光。 |
AVCaptureExposureModeCustom |
设备应仅根据用户提供的感光度 ISO 和曝光时间exposureDuration 属性值调整曝光。 |
我们可以利用下述方法获得设备是否支持给定的曝光模式:
- (BOOL)isExposureModeSupported:(AVCaptureExposureMode)exposureMode;
12.2.3、关于曝光的兴趣点exposurePointOfInterest
为此属性设置值不会启动曝光重新平衡操作。要使用兴趣点设置曝光,首先设置此属性的值,然后将exposureMode
属性设置为AVCaptureExposureModeAutoExpose
或AVCaptureExposureModeContinuousAutoExposure
。
此属性的CGPoint
值使用坐标系,其中{0,0}
是图片区域的左上角,{1,1}
是右下角。无论实际的设备方向如何,此坐标系始终相对于横向设备方向,主页按钮位于右侧。可以使用AVCaptureVideoPreviewLayer
方法在此坐标系和视图坐标之间进行转换。
在更改此属性的值之前,必须调用-lockForConfiguration:
以锁定AVCaptureDevice
;否则,设置此属性的值会引发异常。完成配置设备后,请调用-unlockForConfiguration
以释放锁定并允许其他设备配置设置。
12.3、设置曝光时间和感光度
我们在上文已经了解了如何获取曝光时间和感光度的属性,但是它们都是只读属性,我们能且唯一可用的就是使用下述方法修改曝光时间与感光度
- (void)setExposureModeCustomWithDuration:(CMTime)duration ISO:(float)ISO completionHandler:(void (^)(CMTime syncTime))handler;
该方法将曝光时间和感光度 ISO 锁定在指定值;有三个参数:
参数
CMTime duration
:表示曝光时间。表示当前曝光时间的特殊常量AVCaptureExposureDurationCurrent
将曝光时间锁定为其当前值,即禁用自动曝光。注意,对此属性的更改可能会导致activeVideoMinFrameDuration
或activeVideoMaxFrameDuration
发生更改。参数
float ISO
: 表示感光度。常量AVCaptureISOCurrent
的值可用于指示调用者不希望为ISO指定值,而是应将其设置为其当前值。参数
handler
:当曝光时间exposureDuration
和感光度ISO
都已设置为指定值且曝光模式exposureMode
为AVCaptureExposureModeCustom
时的回调。该块接收与已应用所有设置的第一个缓冲区匹配的时间戳。 时间戳与设备时钟同步,因此必须先转换为主时钟,然后再与通过AVCaptureVideoDataOutput
实例传送的缓冲区的时间戳进行比较。如果不需要知道操作的完成,则为处理程序参数传递nil。
该方法是设置曝光时间 exposureDuration
和感光度 ISO
的唯一方法。
如果将曝光时间exposureDuration
或感光度ISO
设置为不支持的级别,则此方法将抛出NSInvalidArgumentException
异常。
如果在没有调用-lockForConfiguration:
锁定 AVCaptureDevice
的情况下调用此方法,则抛出NSGenericException
异常。
12.4、设置曝光偏差
- (void)setExposureTargetBias:(float)bias completionHandler:(void (^)(CMTime syncTime))handler;
该方法用于设置要应用于目标曝光值的偏差。有两个参数:
- 参数
bias
: 要应用于曝光目标值的偏差。表示当前曝光偏差值的特殊常量AVCaptureExposureTargetBiasCurrent
将曝光偏差锁定为其当前值,即禁用自动曝光。 - 参数
handler
: 将exposureTargetBias
属性设置为指定值时的回调。该块接收时间戳,该时间戳与已应用该设置的第一缓冲区的时间戳匹配。 时间戳与设备时钟同步,因此必须先转换为主时钟,然后再与通过AVCaptureVideoDataOutput
实例传送的缓冲区的时间戳进行比较。如果不需要知道操作的完成,则客户端可以为处理程序参数传递nil。
此方法是设置exposureTargetBias
属性的唯一方法。
如果exposureTargetBias
设置为不支持的级别,则此方法抛出NSInvalidArgumentException
异常。
如果在没有调用-lockForConfiguration:
锁定 AVCaptureDevice
的情况下调用此方法,则抛出NSGenericException
异常。
13、管理低亮度设置
属性 | 类型 | 描述 |
---|---|---|
lowLightBoostSupported |
BOOL |
指示AVCaptureDevice 是否支持在低光照条件下提升图像的布尔值。只有在此属性为YES时,才能设置AVCaptureDevice 对象的automaticEnablesLowLightBoostWhenAvailable 属性。 |
lowLightBoostEnabled |
BOOL |
指示是否启用AVCaptureDevice 的低光增强功能的布尔值。当该属性为“是”时,AVCaptureDevice 已切换到特殊模式,在该模式中可以在图像中感知到更多光。 |
automaticallyEnablesLowLightBoostWhenAvailable |
BOOL |
指示AVCaptureDevice 是否应在必要时自动切换到低光增强模式的布尔值;默认值为NO。 |
在lowLightBoostSupported
为YES的AVCaptureDevice
对象上,可以使用特殊的低光增强模式来提高图像质量。当automaticEnablesLowLightBoostWhenAvailable
属性设置为YES时,AVCaptureDevice
会在低光照条件下自行切换到特殊的升压模式。当场景变得充足时,设备切换回正常操作。支持此功能的AVCaptureDevice
可能仅针对某些源格式或分辨率使用升压模式。
如果lowLightBoostSupported
为NO,则设置automaticEnablesLowLightBoostWhenAvailable
会抛出NSInvalidArgumentException
。
如果在没有调用-lockForConfiguration:
锁定 AVCaptureDevice
的情况下设置automaticEnablesLowLightBoostWhenAvailable
,则抛出NSGenericException
异常。
客户端可以使用键值观察来观察对lowLightBoostEnabled
属性的更改,以了解升压模式何时启用。正常操作和低光增强模式之间的切换可能会丢失一个或多个视频帧。
14、管理帧率设置
14.1、什么帧率?
工业相机的主要参数包括:分辨率、帧率、像素、像元尺寸、光谱响应特性等。
帧率(Frame rate)是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second),简称:FPS或“赫兹”(Hz)。
由于人类眼睛的特殊生理结构,如果所看画面之帧率高于16fps的时候,就会认为是连贯的,此现象称之为视觉暂留。这也就是为什么电影胶片是一格一格拍摄出来,然后快速播放的。
每秒的帧数(fps)或者说帧率表示图形处理器处理场时每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为监视器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。
最大帧率(Frame Rate)/行频(Line Rate):即相机采集传输图像的速率,对于面阵相机一般为每秒采集的帧数(Frames/Sec.),对于线阵相机为每秒采集的行数(Hz)。
相机上的图像采集过程包括两个截然不同的部分。第一部分是曝光。曝光完成后,进行第二部分Readout过程即从传感器的寄存器中读出数据并传送出去(Readout过程)。
14.2、最小帧率
@property(nonatomic) CMTime activeVideoMinFrameDuration;
当前有效的最小帧持续时间。
设备的最小帧持续时间是其最大帧速率的倒数。可以设置此属性的值以限制捕获会话期间的最大帧速率。AVCaptureDevice
根据其活动格式activeFormat
自动选择默认的最小帧持续时间。更改此属性的值后,可以通过将此属性的值设置为kCMTimeInvalid
来返回默认的最小帧持续时间。为 AVCaptureSession
设置sessionPreset
也会将此属性重置为其默认值。
尝试将此属性设置为活动格式的videoSupportedFrameRateRanges
数组中未找到的值会引发异常NSInvalidArgumentException
。
如果在没有调用-lockForConfiguration:
锁定 AVCaptureDevice
的情况下设置activeVideoMinFrameDuration
,则抛出NSGenericException
异常。
14.3、最大帧率
@property(nonatomic) CMTime activeVideoMaxFrameDuration;
设备的最大帧持续时间是其最小帧速率的倒数。
可以设置此属性的值以限制捕获会话期间的最小帧速率。AVCaptureDevice
根据其活动格式activeFormat
自动选择默认的最大帧持续时间。更改此属性的值后,可以通过将此属性的值设置为kCMTimeInvalid
来返回默认的最大帧持续时间。为AVCaptureSession
设置sessionPreset
也会将此属性重置为其默认值。
尝试将此属性设置为活动格式的videoSupportedFrameRateRanges
数组中未找到的值会引发异常NSInvalidArgumentException
。
如果在没有调用-lockForConfiguration:
锁定 AVCaptureDevice
的情况下设置activeVideoMaxFrameDuration
,则抛出NSGenericException
异常。
下面的代码示例演示了如何选择iOS设备的最高帧率:
- (void)configureCameraForHighestFrameRate:(AVCaptureDevice *)device
{
AVCaptureDeviceFormat *bestFormat = nil;
AVFrameRateRange *bestFrameRateRange = nil;
for ( AVCaptureDeviceFormat *format in [device formats] ) {
for ( AVFrameRateRange *range in format.videoSupportedFrameRateRanges ) {
if ( range.maxFrameRate > bestFrameRateRange.maxFrameRate ) {
bestFormat = format;
bestFrameRateRange = range;
}
}
}
if ( bestFormat ) {
if ( [device lockForConfiguration:NULL] == YES ) {
device.activeFormat = bestFormat;
device.activeVideoMinFrameDuration = bestFrameRateRange.minFrameDuration;
device.activeVideoMaxFrameDuration = bestFrameRateRange.minFrameDuration;
[device unlockForConfiguration];
}
}
}
15、传输管理控制
属性 | 类型 | 描述 |
---|---|---|
transportControls Supported |
BOOL |
指示设备是否支持传输控制命令。对于具有传输控件的设备,例如基于AVC磁带的摄像机或具有RS422卡座控制的专业捕获设备,此属性的值为YES。 如果不支持传输控制,则接收器上没有相关的传输控制方法和属性。 |
transportControls PlaybackMode |
AVCaptureDevice TransportControls PlaybackMode |
当前的播放模式;此属性仅对支持传输控制的设备有效。 |
transportControlsSpeed |
AVCaptureDevice TransportControls Speed |
目前的播放速度。 |
AVCaptureDeviceTransportControlsPlaybackMode 表示传输控件当前播放模式的枚举。
枚举值 | 描述 |
---|---|
AVCaptureDeviceTransportControlsNotPlayingMode |
表示磁带传输没有穿过播放头。 |
AVCaptureDeviceTransportControlsPlayingMode |
表示磁带传输穿过播放头。 |
AVCaptureDeviceTransportControlsSpeed typedef
修饰的用于表示播放速度的类别。该值的含义示例:
值 | 含义 |
---|---|
0.0 |
停止 |
1.0 |
以正常速度前进。 |
-1.0 |
以正常速度反转。 |
2.0 |
以2x正常速度前进。 |
设置播放模式和速度
下述方法用于设置传输控件的播放模式和速度:
- (void)setTransportControlsPlaybackMode:(AVCaptureDeviceTransportControlsPlaybackMode)mode
speed:(AVCaptureDeviceTransportControlsSpeed)speed;
该方法有两个参数:
- 参数
mode
:AVCaptureDeviceTransportControlsPlaybackMode
常量,指示是否应将牌组置于播放模式。 - 参数
speed
:AVCaptureDeviceTransportControlsSpeed
值,指示卷绕或播放磁带的速度。
如果在没有调用-lockForConfiguration:
锁定 AVCaptureDevice
的情况下调用此方法,则抛出NSGenericException
异常。
16、监测主题领域变化
16.1、监视更改
@property(nonatomic, getter=isSubjectAreaChangeMonitoringEnabled) BOOL subjectAreaChangeMonitoringEnabled;
此属性的值指示接收器是否应监视视频主题区域的更改,例如照明更改,实质移动等。
如果启用了主题区域更改监视,则捕获设备对象会在检测到主题区域发生更改时发送AVCaptureDeviceSubjectAreaDidChangeNotification
,此时感兴趣的客户端可能希望重新聚焦,调整曝光,白平衡等。
在更改此属性的值之前,必须调用-lockForConfiguration:
以获得对设备配置属性的访问权,否则,设置此属性的值将引发异常;完成设备配置后,调用-unlockForConfiguration
释放锁并允许其他设备配置设置
16.2、更改时的通知
NSString *const AVCaptureDeviceSubjectAreaDidChangeNotification;
当AVCaptureDevice
实例检测到视频主题区域发生重大变化时发送通知。
客户端可以观察AVCaptureDeviceSubjectAreaDidChangeNotification
以了解AVCaptureDevice
的实例何时检测到视频主题区域的实质性变化。
仅当subjectAreaChangeMonitoringEnabled
为YES
时才会发送此通知。
17、管理白平衡
17.1、什么是白平衡?
白平衡,字面上的理解是白色的平衡。通过它可以解决色彩还原和色调处理的一系列问题。它是实现摄像机图像能精确反映被摄物的色彩状况,有手动白平衡和自动白平衡等方式。许多人在使用数码摄像机拍摄的时候都会遇到这样的问题:在日光灯的房间里拍摄的影像会显得发绿,在室内钨丝灯光下拍摄出来的景物就会偏黄,而在日光阴影处拍摄到的照片则莫名其妙地偏蓝,其原因就在于白平衡的设置上。
我们可以使用以下属性获取AVCaptureDevice
当前是否正在调整白平衡:
@property(nonatomic, readonly, getter=isAdjustingWhiteBalance) BOOL adjustingWhiteBalance;
17.2、白平衡模式AVCaptureWhiteBalanceMode
@property(nonatomic) AVCaptureWhiteBalanceMode whiteBalanceMode;
我们可以使用该属性获取或者设置目前的白平衡模式;在更改此属性的值之前,必须调用-lockForConfiguration:
以获得对设备配置属性的访问权。
AVCaptureWhiteBalanceMode 用于指定捕获设备的白平衡模式的枚举。
枚举 | 描述 |
---|---|
AVCaptureWhiteBalanceModeLocked |
白平衡设置已锁定。 |
AVCaptureWhiteBalanceModeAutoWhiteBalance |
设备现在执行自动白平衡操作。 |
AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance |
该设备可持续监控白平衡并在必要时进行调整。 |
当然,我们在设置白平衡模式AVCaptureWhiteBalanceMode
时,需要确定设备是否支持指定的模式
- (BOOL)isWhiteBalanceModeSupported:(AVCaptureWhiteBalanceMode)whiteBalanceMode;
该方法返回一个布尔值,指示是否支持给定的白平衡模式。如果支持whiteBalanceMode
,则为YES,否则为NO。
17.3、白平衡增益AVCaptureWhiteBalanceGains
@property(nonatomic, readonly) float maxWhiteBalanceGain;
一个只读属性,最大的白平衡增益;该值在对象的生命周期内不会更改。
typedef struct {
float redGain; //白平衡值的红色增益分量。
float greenGain; //白平衡值的绿色增益分量。
float blueGain; //白平衡值的蓝色增益分量。
} AVCaptureWhiteBalanceGains
包含RGB白平衡增益值的结构,对于该结构中的每个成员,仅支持1.0
和maxWhiteBalanceGain
之间的值。如果结构成员设置为不受支持的值,则此方法抛出NSInvalidArgumentException
异常。
@property(nonatomic, readonly) AVCaptureWhiteBalanceGains deviceWhiteBalanceGains;
获取白平衡增益。这些值可用于调整给定场景的色偏。无论白平衡模式如何,都可以随时读取该值。
我们可以使用下述方利用指定的deviceWhiteBalanceGains
值将白平衡设置为锁定模式。
- (void)setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:(AVCaptureWhiteBalanceGains)whiteBalanceGains
completionHandler:(void (^)(CMTime syncTime))handler;
该方法有两个参数:
- 参数
whiteBalanceGains
: 白平衡增加到设定。表示当前白平衡设置的结构常量AVCaptureWhiteBalanceGainsCurrent
将白平衡增益锁定为其当前值,即禁用自动白平衡。如果将whiteBalanceGains
设置为不支持的级别,则此方法抛出异常NSInvalidArgumentException
。 - 参数
handler
:当白平衡增益已设置为指定值且whiteBalanceMode
属性为AVCaptureWhiteBalanceModeLocked
时要调用的块。 该块接收与已应用所有设置的第一个缓冲区匹配的时间戳。 时间戳与设备时钟同步,因此必须先转换为主时钟,然后再与通过AVCaptureVideoDataOutput
实例传送的缓冲区的时间戳进行比较。如果不需要同步,则此参数可以为nil
。
调用该方法时,如果lockingWhiteBalanceWithCustomDeviceGainsSupported
属性为NO,使用除AVCaptureWhiteBalanceGainsCurrent
之外的白平衡增益值会引发异常。
在调用此方法之前,必须调用-lockForConfiguration:
以获得对设备配置属性的访问权。
@property(nonatomic, readonly, getter=isLockingWhiteBalanceWithCustomDeviceGainsSupported) BOOL lockingWhiteBalanceWithCustomDeviceGainsSupported;
指示设备是否支持将白平衡锁定到特定增益值的布尔值。
@property(nonatomic, readonly) AVCaptureWhiteBalanceGains grayWorldDeviceWhiteBalanceGains;
中性灰色白点所需的当前设备特定白平衡值。该属性指定从当前场景派生的当前红色,绿色和蓝色增益值,以提供白平衡的中性(或灰色世界)白点。
灰色世界值假定中间主体(例如灰卡)已放置在主题区域的中间并填充帧的中心50%。 客户端可以使用-setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler:
读取这些值并将其应用于设备。
17.4、CIE 1931色度坐标系
包含CIE 1931色度坐标的结构:
typedef struct {
float x;//表示与红色有关的相对量值,值范围介于0到0.8之间。
float y;//表示与绿色有关的相对量值,值范围介于0和0.85之间。
} AVCaptureWhiteBalanceChromaticityValues
使用下述方法将白平衡增益AVCaptureWhiteBalanceGains
转换为 CIE 1931色度坐标系,进行白平衡色度调节
- (AVCaptureWhiteBalanceChromaticityValues)chromaticityValuesForDeviceWhiteBalanceGains:(AVCaptureWhiteBalanceGains)whiteBalanceGains;
该方法的参数与返回值:
- 参数
whiteBalanceGains
:白平衡增益值。 可能不使用AVCaptureWhiteBalanceGainsCurrent
的值。 - 返回值:包含CIE 1931色度坐标的结构
使用下述方法将 CIE 1931色度坐标系转换为白平衡增益AVCaptureWhiteBalanceGains
:
- (AVCaptureWhiteBalanceGains)deviceWhiteBalanceGainsForChromaticityValues:(AVCaptureWhiteBalanceChromaticityValues)chromaticityValues;
注意:某些 chromaticityValues
字段组合产生超出范围的设备RGB值,如果直接传递给 -setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler:
将导致抛出异常。务必检查红色,绿色和蓝色增益值是否在 [1.0 - maxWhiteBalanceGain]
的范围内。
17.5、温度和色彩度的白平衡调节
含有与白平衡色相关的温度和色彩值的结构
typedef struct {
float temperature; //以开尔文表示的白平衡色相关温度。
float tint; //白平衡色彩值在-150.0到+150.0之间。
} AVCaptureWhiteBalanceTemperatureAndTintValues
我们可以调用下述方法获取当前白平衡增益AVCaptureWhiteBalanceGains
下的温度和色彩度
- (AVCaptureWhiteBalanceTemperatureAndTintValues)temperatureAndTintValuesForDeviceWhiteBalanceGains:(AVCaptureWhiteBalanceGains)whiteBalanceGains;
该方法的参数与返回值:
参数 whiteBalanceGains
:包含RGB白平衡增益值的结构;可以不使用AVCaptureWhiteBalanceGainsCurrent
的值。
返回值: 返回一个含有与白平衡色相关的温度和色彩值的结构
18、管理高动态范围视频
属性 | 类型 | 描述 |
---|---|---|
automaticallyAdjustsVideoHDREnabled |
BOOL |
指示是否允许AVCaptureDevice 打开或关闭高动态范围流,默认值为YES。 |
videoHDREnabled |
BOOL |
指示是否允许接收器打开或关闭高动态范围流,默认值为YES。 |
默认情况下,当客户端使用activeFormat
属性设置新格式时,AVCaptureDevice
始终将videoHDREnabled
设置为NO。
当客户端使用AVCaptureSession
属性sessionPreset
时,AVCaptureDevice
会自动打开视频HDR,如果它非常适合预设。客户端可以使用videoHDREnabled
属性的键值观察来了解接收器何时自动更改了值。
如果在没有调用-lockForConfiguration:
锁定 AVCaptureDevice
的情况下设置此属性,则抛出NSGenericException
异常。
19、管理颜色空间
@property(nonatomic) AVCaptureColorSpace activeColorSpace;
管理色彩空间,当前活动的色彩空间用于捕获。
所有设备和格式都支持sRGB色彩空间中的捕获。某些设备和格式也可以在P3色彩空间中捕捉,其中包括比sRGB色彩空间宽得多的色域。默认情况下,AVCaptureSession
会自动为受支持的设备捕获宽色域捕获并捕获工作流;
为获得最佳效果,请在AVCaptureSession
上调用-startRunning
之前选择一个颜色空间。在AVCaptureSession
运行时更改此属性需要对捕获渲染管道进行破坏性重新配置,正在进行的影片捕获将立即结束,未实现的照片请求将中止,并且视频预览将暂时冻结。
如果在没有调用-lockForConfiguration:
锁定 AVCaptureDevice
的情况下设置此属性,则抛出NSGenericException
异常。
AVCaptureColorSpace用于指定用于图像和视频捕获的色域和格式的枚举,与activeColorSpace属性一起使用。默认情况下,AVCaptureSession
类自动为受支持的设备和捕获工作流启用宽色域捕获。
枚举值 | 描述 |
---|---|
AVCaptureColorSpace_sRGB |
标准RGB色彩空间。 |
AVCaptureColorSpace_P3_D65 |
数字影院标准DCI-P3色彩空间,带有CIE D65标准白点。 |
20、处理系统压力变化
20.1、状态信息systemPressureState
@property(nonatomic, readonly) AVCaptureSystemPressureState *systemPressureState;
影响捕获系统性能和可用性的操作系统和硬件状态的当前状态。当前的操作系统和硬件状态影响捕获系统的性能和可用性。
AVCaptureSystemPressureState 有关影响捕获系统性能和可用性的OS和硬件状态的信息。
iOS 设备上的摄像头捕获系统的性能和可用性受到多种外部因素的影响,例如电源使用和设备温度。如果在捕获会话期间总系统压力达到过高水平,则捕获系统会自动关闭,从而导致会话中断。在较轻的压力下,系统可以自动降低捕获质量。
要避免此类中断,需要使用KVO来监视AVCaptureDevice
上systemPressureState
属性的值,并在系统压力增加时采取措施降低捕获会话的性能影响;例如,通过降低捕获帧速率。
20.2、总体水平level
@property(atomic, readonly) AVCaptureSystemPressureLevel level;
捕获系统性能约束的整体表征。操作系统和硬件状态的几个方面会影响捕获系统的性能和可用性。整体系统压力水平代表最关键的潜在因素。
typedef NSString *AVCaptureSystemPressureLevel;
表示系统压力水平的结构
值 | 描述 |
---|---|
AVCaptureSystemPressureLevelNominal |
系统压力水平正常(未加压)。 |
AVCaptureSystemPressureLevelFair |
系统压力略有升高。 |
AVCaptureSystemPressureLevelSerious |
系统压力大大提高。 捕获性能可能会受到影响。 建议采用帧率限制。 |
AVCaptureSystemPressureLevelCritical |
系统压力严重升高。 捕获质量和性能受到显着影响。 强烈建议使用帧速率限制。 |
AVCaptureSystemPressureLevelShutdown |
系统压力超出临界值,因此捕获系统已关闭。当系统压力达到此水平时,捕获系统会自动关闭,从而导致会话中断。在中断通知的userInfo 字典中使用AVCaptureSessionInterruptionSystemPressureStateKey 来查找导致中断的系统压力因素的详细信息。 |
20.3、影响因素
@property(atomic, readonly) AVCaptureSystemPressureFactors factors;
系统压力水平的一系列根本原因。系统压力水平较高时,可以使用此信息选择如何缓解问题。
例如,在多镜头设备上由于AVCaptureSystemPressureFactorDepthModuleTemperature
导致的高系统压力可以通过限制深度捕获帧速率来减少。
AVCaptureSystemPressureFactors
影响捕获系统性能的一组因素。如果系统压力级别为AVCaptureSystemPressureLevelNominal
(即捕获系统性能不受其他OS和硬件因素的影响),则此值为空集。
值 | 描述 |
---|---|
AVCaptureSystemPressureFactorNone |
系统压力目前是标称值。 |
AVCaptureSystemPressureFactorSystemTemperature |
整个系统的热负荷都很高。 |
AVCaptureSystemPressureFactorPeakPower |
系统的峰值功率要求超过了电池的当前容量。具有化学老化电池的设备不太能够响应总功率使用(CPU和GPU使用,I/O,相机系统,无线电等)的快速增加。当设备检测到这种情况时,可能会限制捕获系统性能,以防止意外的设备关闭。 |
AVCaptureSystemPressureFactorDepthModuleTemperature |
捕获深度信息的模块在升高的温度下操作。随着系统压力的增加,深度质量可能会降低。要从此因素降低系统压力,需要降低深度捕获帧速率。此因素仅适用于多镜头设备。 |