11、管理感光度 ISO
11.1、什么是感光度 ISO
在數(shù)碼相機中 ISO 表示感光元件的感光的速度。感光度 ISO 數(shù)值越高就說明該感光元器件的感光能力越強,對曝光量的要求就越少。一般情況下,ISO 值越低,相片的質(zhì)量越高,相片的細節(jié)表現(xiàn)的得越細膩;ISO 值越高,相片的亮度就越高,而相片的質(zhì)量會隨著 ISO值的升高而降低,噪點會變得越來越嚴重,但高 ISO 值可以彌補光線的不足。
11.2、獲取AVCaptureDevice的感光度ISO
@property(nonatomic, readonly) float ISO;
當前曝光的感光度 ISO 值。此屬性通過應(yīng)用于信號的增益值返回傳感器對光的靈敏度。
僅支持minISO和maxISO之間的ISO值;值越高,圖像越嘈雜。
無論曝光模式如何,都可以隨時讀取屬性值,但只能使用-setExposureModeCustomWithDuration:ISO:completionHandler:方法進行設(shè)置。
常量const float AVCaptureISOCurrent;表示調(diào)用者不希望為 ISO 屬性指定值,而是應(yīng)將其設(shè)置為其當前值。
12、曝光設(shè)置
12.1、關(guān)于相機的一些概念
12.1.1、光圈
光圈是一個用來控制光線透過鏡頭,進入機身內(nèi)感光面的光量的裝置;它通常是在鏡頭內(nèi)。
表達光圈大小我們是用F值:光圈F值 = 鏡頭的焦距/鏡頭口徑的直徑;從以上的公式可知要達到相同的光圈F值,長焦距鏡頭的口徑要比短焦距鏡頭的口徑大。當光圈物理孔徑不變時,鏡頭中心與感光器件距離愈遠,F(xiàn)數(shù)愈大,反之,鏡頭中心與感光器件距離愈近,通過光孔到達感光器件的光密度愈高,F(xiàn)數(shù)就愈小。
完整的光圈值系列如下: F1, F1.4, F2, F2.8, F4, F5.6, F8, F11, F16, F22, F32, F44, F64。
光圈F值愈小,在同一單位時間內(nèi)的進光量便愈多,而且上一級的進光量剛是下一級的一倍,例如光圈從F8調(diào)整到F5.6,進光量便多一倍,我們也說光圈開大了一級。
12.1.2、快門
快門是照相機用來控制感光片有效曝光時間的裝置。是照相機的一個重要組成部分,它的結(jié)構(gòu)、形式及功能是衡量照相機檔次的一個重要因素。一般而言快門的時間范圍越大越好。秒數(shù)低適合拍運動中的物體,某款相機就強調(diào)快門最快能到1/16000秒,可輕松抓住急速移動的目標。不過當你要拍的是夜晚的車水馬龍,快門時間就要拉長,常見照片中絲絹般的水流效果也要用慢速快門才能拍出來。
快門速度單位是“秒”。專業(yè)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、曝光
曝光:是指當你按相機快門按鈕的時候,快門(鏡頭外的世界和機身內(nèi)部感光元件之間的門)會打開,過一段時間再關(guān)上;就在這一小段時間之內(nèi),光線會從鏡頭鉆進來,照在長方形的感光元件上邊,感光元件上幾千萬的感光點就會記錄照到它上邊的光的色彩;于是,就得到一張照片了。
曝光就是 光圈、快門 和 感光度ISO 的組合。
曝光值 是由快門速度值和光圈值組合表示攝影鏡頭通光能力的一個數(shù)值。
可以這樣認為:光圈值大小其實就是那個小圓窗戶開多大;快門(速度)就是窗戶打開多久。
假設(shè)窗戶只打開1/4,時間為4秒鐘可以正確曝光的話,很顯然,窗戶打開一半,時間2秒鐘也能讓底片正確曝光,因為 1/44 = 1/22 = 1,進光量都是一樣多。同樣的,如果窗戶全開,曝光時間就只需要1秒了。
假若一個鏡頭光圈全開為 F4,用攝影行話來說,光圈 F4 快門速度 1 秒為正確曝光值,那 F5.6 和 2 秒以及 F8 和 4 秒也同樣能得到準確曝光的圖片。
一張正確曝光的圖片可以有N種不同的光圈和快門速度組合。
12.1.4、曝光的興趣點
興趣點,又被稱為點特征,指的是圖像中具有特殊性質(zhì)的像素點,是圖像的重要特征。它具有旋轉(zhuǎn)不變性和不隨光照條件變化的優(yōu)點。這類點被大量用于解決物體識別,圖像匹配,視覺跟蹤,三維重建等問題。
12.2、曝光的一些屬性
| 屬性 | 類型 | 描述 |
|---|---|---|
exposureDuration |
CMTime |
一個只讀屬性,表示曝光時間;僅支持minExposureDuration和maxExposureDuration之間的曝光持續(xù)時間值。無論曝光模式如何,都可以隨時讀取曝光時間。 |
exposureTargetOffset |
float |
一個只讀屬性,表示當前場景的計量曝光水平與目標曝光值之間的差異;以EV為單位。 |
exposureTargetBias |
float |
一個只讀屬性,以EV單位應(yīng)用于目標暴露值的偏差。當曝光模式為AVCaptureExposureModeAutoExpose或AVCaptureExposureModeLocked時,偏差將影響測光(exposureTargetOffset)和實際曝光等級:曝光時間exposureDuration和感光度ISO。 當曝光模式為AVCaptureExposureModeCustom時,它只會影響測光。 |
minExposureTargetBias |
float |
一個只讀屬性,EV單位支持的最小曝光偏差。 |
maxExposureTargetBias |
float |
一個只讀屬性,以EV為單位的最大支持曝光偏差。 |
activeMaxExposureDuration |
CMTime |
自動曝光算法中定義的最長曝光持續(xù)時間(以秒為單位)。 |
adjustingExposure |
BOOL |
一個只讀屬性,指示設(shè)備當前是否正在調(diào)整其曝光設(shè)置。 |
exposureMode |
AVCaptureExposureMode |
設(shè)備的曝光模式。在更改此屬性的值之前,必須調(diào)用-lockForConfiguration:以鎖定AVCaptureDevice;否則,設(shè)置此屬性的值會引發(fā)異常。完成配置設(shè)備后,請調(diào)用-unlockForConfiguration以釋放鎖定并允許其他設(shè)備配置設(shè)置。 |
exposurePointOfInterestSupported |
BOOL |
一個只讀屬性,指示設(shè)備是否支持曝光的興趣點。 |
exposurePointOfInterest |
CGPoint |
曝光的興趣點。 |
12.2.1、關(guān)于activeMaxExposureDuration屬性
在AVCaptureSession設(shè)置sessionPreset或在AVCaptureDevice上選擇其他activeFormat時,可以查詢或觀察對activeMaxExposureDuration的更改。
可以隨時覆蓋此屬性,以及activeFormat屬性的minExposureDuration和maxExposureDuration范圍中的任何值。會話運行時會立即反映更改,而不會重建圖形。
還可以將屬性設(shè)置為kCMTimeInvalid以返回默認值。例如,如果想要比幀速率更短的曝光,則可以覆蓋自動曝光算法的最大曝光持續(xù)時間。 如果需要通過暴露1/40秒但仍然每秒捕獲30幀來凍結(jié)運動,則需要手動覆蓋。
12.2.2、關(guān)于曝光模式AVCaptureExposureMode
AVCaptureExposureMode 用于指定AVCaptureDevice曝光模式的枚舉。
| 枚舉值 | 描述 |
|---|---|
AVCaptureExposureModeLocked |
曝光設(shè)置已鎖定。 |
AVCaptureExposureModeAutoExpose |
設(shè)備會自動調(diào)整曝光一次,然后將曝光模式更改為AVCaptureExposureModeLocked
|
AVCaptureExposureModeContinuousAutoExposure |
設(shè)備會持續(xù)監(jiān)控曝光量并在必要時自動曝光。 |
AVCaptureExposureModeCustom |
設(shè)備應(yīng)僅根據(jù)用戶提供的感光度 ISO 和曝光時間exposureDuration屬性值調(diào)整曝光。 |
我們可以利用下述方法獲得設(shè)備是否支持給定的曝光模式:
- (BOOL)isExposureModeSupported:(AVCaptureExposureMode)exposureMode;
12.2.3、關(guān)于曝光的興趣點exposurePointOfInterest
為此屬性設(shè)置值不會啟動曝光重新平衡操作。要使用興趣點設(shè)置曝光,首先設(shè)置此屬性的值,然后將exposureMode屬性設(shè)置為AVCaptureExposureModeAutoExpose或AVCaptureExposureModeContinuousAutoExposure。
此屬性的CGPoint值使用坐標系,其中{0,0}是圖片區(qū)域的左上角,{1,1}是右下角。無論實際的設(shè)備方向如何,此坐標系始終相對于橫向設(shè)備方向,主頁按鈕位于右側(cè)??梢允褂?code>AVCaptureVideoPreviewLayer方法在此坐標系和視圖坐標之間進行轉(zhuǎn)換。
在更改此屬性的值之前,必須調(diào)用-lockForConfiguration:以鎖定AVCaptureDevice;否則,設(shè)置此屬性的值會引發(fā)異常。完成配置設(shè)備后,請調(diào)用-unlockForConfiguration以釋放鎖定并允許其他設(shè)備配置設(shè)置。
12.3、設(shè)置曝光時間和感光度
我們在上文已經(jīng)了解了如何獲取曝光時間和感光度的屬性,但是它們都是只讀屬性,我們能且唯一可用的就是使用下述方法修改曝光時間與感光度
- (void)setExposureModeCustomWithDuration:(CMTime)duration ISO:(float)ISO completionHandler:(void (^)(CMTime syncTime))handler;
該方法將曝光時間和感光度 ISO 鎖定在指定值;有三個參數(shù):
參數(shù)
CMTime duration:表示曝光時間。表示當前曝光時間的特殊常量AVCaptureExposureDurationCurrent將曝光時間鎖定為其當前值,即禁用自動曝光。注意,對此屬性的更改可能會導致activeVideoMinFrameDuration或activeVideoMaxFrameDuration發(fā)生更改。參數(shù)
float ISO: 表示感光度。常量AVCaptureISOCurrent的值可用于指示調(diào)用者不希望為ISO指定值,而是應(yīng)將其設(shè)置為其當前值。參數(shù)
handler:當曝光時間exposureDuration和感光度ISO都已設(shè)置為指定值且曝光模式exposureMode為AVCaptureExposureModeCustom時的回調(diào)。該塊接收與已應(yīng)用所有設(shè)置的第一個緩沖區(qū)匹配的時間戳。 時間戳與設(shè)備時鐘同步,因此必須先轉(zhuǎn)換為主時鐘,然后再與通過AVCaptureVideoDataOutput實例傳送的緩沖區(qū)的時間戳進行比較。如果不需要知道操作的完成,則為處理程序參數(shù)傳遞nil。
該方法是設(shè)置曝光時間 exposureDuration 和感光度 ISO 的唯一方法。
如果將曝光時間exposureDuration或感光度ISO設(shè)置為不支持的級別,則此方法將拋出NSInvalidArgumentException異常。
如果在沒有調(diào)用-lockForConfiguration:鎖定 AVCaptureDevice的情況下調(diào)用此方法,則拋出NSGenericException異常。
12.4、設(shè)置曝光偏差
- (void)setExposureTargetBias:(float)bias completionHandler:(void (^)(CMTime syncTime))handler;
該方法用于設(shè)置要應(yīng)用于目標曝光值的偏差。有兩個參數(shù):
- 參數(shù)
bias: 要應(yīng)用于曝光目標值的偏差。表示當前曝光偏差值的特殊常量AVCaptureExposureTargetBiasCurrent將曝光偏差鎖定為其當前值,即禁用自動曝光。 - 參數(shù)
handler: 將exposureTargetBias屬性設(shè)置為指定值時的回調(diào)。該塊接收時間戳,該時間戳與已應(yīng)用該設(shè)置的第一緩沖區(qū)的時間戳匹配。 時間戳與設(shè)備時鐘同步,因此必須先轉(zhuǎn)換為主時鐘,然后再與通過AVCaptureVideoDataOutput實例傳送的緩沖區(qū)的時間戳進行比較。如果不需要知道操作的完成,則客戶端可以為處理程序參數(shù)傳遞nil。
此方法是設(shè)置exposureTargetBias屬性的唯一方法。
如果exposureTargetBias設(shè)置為不支持的級別,則此方法拋出NSInvalidArgumentException異常。
如果在沒有調(diào)用-lockForConfiguration:鎖定 AVCaptureDevice的情況下調(diào)用此方法,則拋出NSGenericException異常。
13、管理低亮度設(shè)置
| 屬性 | 類型 | 描述 |
|---|---|---|
lowLightBoostSupported |
BOOL |
指示AVCaptureDevice是否支持在低光照條件下提升圖像的布爾值。只有在此屬性為YES時,才能設(shè)置AVCaptureDevice對象的automaticEnablesLowLightBoostWhenAvailable屬性。 |
lowLightBoostEnabled |
BOOL |
指示是否啟用AVCaptureDevice的低光增強功能的布爾值。當該屬性為“是”時,AVCaptureDevice已切換到特殊模式,在該模式中可以在圖像中感知到更多光。 |
automaticallyEnablesLowLightBoostWhenAvailable |
BOOL |
指示AVCaptureDevice是否應(yīng)在必要時自動切換到低光增強模式的布爾值;默認值為NO。 |
在lowLightBoostSupported為YES的AVCaptureDevice對象上,可以使用特殊的低光增強模式來提高圖像質(zhì)量。當automaticEnablesLowLightBoostWhenAvailable屬性設(shè)置為YES時,AVCaptureDevice會在低光照條件下自行切換到特殊的升壓模式。當場景變得充足時,設(shè)備切換回正常操作。支持此功能的AVCaptureDevice可能僅針對某些源格式或分辨率使用升壓模式。
如果lowLightBoostSupported為NO,則設(shè)置automaticEnablesLowLightBoostWhenAvailable會拋出NSInvalidArgumentException。
如果在沒有調(diào)用-lockForConfiguration:鎖定 AVCaptureDevice的情況下設(shè)置automaticEnablesLowLightBoostWhenAvailable,則拋出NSGenericException異常。
客戶端可以使用鍵值觀察來觀察對lowLightBoostEnabled屬性的更改,以了解升壓模式何時啟用。正常操作和低光增強模式之間的切換可能會丟失一個或多個視頻幀。
14、管理幀率設(shè)置
14.1、什么幀率?
工業(yè)相機的主要參數(shù)包括:分辨率、幀率、像素、像元尺寸、光譜響應(yīng)特性等。
幀率(Frame rate)是用于測量顯示幀數(shù)的量度。所謂的測量單位為每秒顯示幀數(shù)(Frames per Second),簡稱:FPS或“赫茲”(Hz)。
由于人類眼睛的特殊生理結(jié)構(gòu),如果所看畫面之幀率高于16fps的時候,就會認為是連貫的,此現(xiàn)象稱之為視覺暫留。這也就是為什么電影膠片是一格一格拍攝出來,然后快速播放的。
每秒的幀數(shù)(fps)或者說幀率表示圖形處理器處理場時每秒鐘能夠更新的次數(shù)。高的幀率可以得到更流暢、更逼真的動畫。一般來說30fps就是可以接受的,但是將性能提升至60fps則可以明顯提升交互感和逼真感,但是一般來說超過75fps一般就不容易察覺到有明顯的流暢度提升了。如果幀率超過屏幕刷新率只會浪費圖形處理的能力,因為監(jiān)視器不能以這么快的速度更新,這樣超過刷新率的幀率就浪費掉了。
最大幀率(Frame Rate)/行頻(Line Rate):即相機采集傳輸圖像的速率,對于面陣相機一般為每秒采集的幀數(shù)(Frames/Sec.),對于線陣相機為每秒采集的行數(shù)(Hz)。
相機上的圖像采集過程包括兩個截然不同的部分。第一部分是曝光。曝光完成后,進行第二部分Readout過程即從傳感器的寄存器中讀出數(shù)據(jù)并傳送出去(Readout過程)。
14.2、最小幀率
@property(nonatomic) CMTime activeVideoMinFrameDuration;
當前有效的最小幀持續(xù)時間。
設(shè)備的最小幀持續(xù)時間是其最大幀速率的倒數(shù)。可以設(shè)置此屬性的值以限制捕獲會話期間的最大幀速率。AVCaptureDevice 根據(jù)其活動格式activeFormat自動選擇默認的最小幀持續(xù)時間。更改此屬性的值后,可以通過將此屬性的值設(shè)置為kCMTimeInvalid來返回默認的最小幀持續(xù)時間。為 AVCaptureSession設(shè)置sessionPreset也會將此屬性重置為其默認值。
嘗試將此屬性設(shè)置為活動格式的videoSupportedFrameRateRanges數(shù)組中未找到的值會引發(fā)異常NSInvalidArgumentException。
如果在沒有調(diào)用-lockForConfiguration:鎖定 AVCaptureDevice的情況下設(shè)置activeVideoMinFrameDuration,則拋出NSGenericException異常。
14.3、最大幀率
@property(nonatomic) CMTime activeVideoMaxFrameDuration;
設(shè)備的最大幀持續(xù)時間是其最小幀速率的倒數(shù)。
可以設(shè)置此屬性的值以限制捕獲會話期間的最小幀速率。AVCaptureDevice根據(jù)其活動格式activeFormat自動選擇默認的最大幀持續(xù)時間。更改此屬性的值后,可以通過將此屬性的值設(shè)置為kCMTimeInvalid來返回默認的最大幀持續(xù)時間。為AVCaptureSession設(shè)置sessionPreset也會將此屬性重置為其默認值。
嘗試將此屬性設(shè)置為活動格式的videoSupportedFrameRateRanges數(shù)組中未找到的值會引發(fā)異常NSInvalidArgumentException。
如果在沒有調(diào)用-lockForConfiguration:鎖定 AVCaptureDevice的情況下設(shè)置activeVideoMaxFrameDuration,則拋出NSGenericException異常。
下面的代碼示例演示了如何選擇iOS設(shè)備的最高幀率:
- (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 |
指示設(shè)備是否支持傳輸控制命令。對于具有傳輸控件的設(shè)備,例如基于AVC磁帶的攝像機或具有RS422卡座控制的專業(yè)捕獲設(shè)備,此屬性的值為YES。 如果不支持傳輸控制,則接收器上沒有相關(guān)的傳輸控制方法和屬性。 |
transportControls PlaybackMode |
AVCaptureDevice TransportControls PlaybackMode |
當前的播放模式;此屬性僅對支持傳輸控制的設(shè)備有效。 |
transportControlsSpeed |
AVCaptureDevice TransportControls Speed |
目前的播放速度。 |
AVCaptureDeviceTransportControlsPlaybackMode 表示傳輸控件當前播放模式的枚舉。
| 枚舉值 | 描述 |
|---|---|
AVCaptureDeviceTransportControlsNotPlayingMode |
表示磁帶傳輸沒有穿過播放頭。 |
AVCaptureDeviceTransportControlsPlayingMode |
表示磁帶傳輸穿過播放頭。 |
AVCaptureDeviceTransportControlsSpeed typedef修飾的用于表示播放速度的類別。該值的含義示例:
| 值 | 含義 |
|---|---|
0.0 |
停止 |
1.0 |
以正常速度前進。 |
-1.0 |
以正常速度反轉(zhuǎn)。 |
2.0 |
以2x正常速度前進。 |
設(shè)置播放模式和速度
下述方法用于設(shè)置傳輸控件的播放模式和速度:
- (void)setTransportControlsPlaybackMode:(AVCaptureDeviceTransportControlsPlaybackMode)mode
speed:(AVCaptureDeviceTransportControlsSpeed)speed;
該方法有兩個參數(shù):
- 參數(shù)
mode:AVCaptureDeviceTransportControlsPlaybackMode常量,指示是否應(yīng)將牌組置于播放模式。 - 參數(shù)
speed:AVCaptureDeviceTransportControlsSpeed值,指示卷繞或播放磁帶的速度。
如果在沒有調(diào)用-lockForConfiguration:鎖定 AVCaptureDevice的情況下調(diào)用此方法,則拋出NSGenericException異常。
16、監(jiān)測主題領(lǐng)域變化
16.1、監(jiān)視更改
@property(nonatomic, getter=isSubjectAreaChangeMonitoringEnabled) BOOL subjectAreaChangeMonitoringEnabled;
此屬性的值指示接收器是否應(yīng)監(jiān)視視頻主題區(qū)域的更改,例如照明更改,實質(zhì)移動等。
如果啟用了主題區(qū)域更改監(jiān)視,則捕獲設(shè)備對象會在檢測到主題區(qū)域發(fā)生更改時發(fā)送AVCaptureDeviceSubjectAreaDidChangeNotification,此時感興趣的客戶端可能希望重新聚焦,調(diào)整曝光,白平衡等。
在更改此屬性的值之前,必須調(diào)用-lockForConfiguration:以獲得對設(shè)備配置屬性的訪問權(quán),否則,設(shè)置此屬性的值將引發(fā)異常;完成設(shè)備配置后,調(diào)用-unlockForConfiguration釋放鎖并允許其他設(shè)備配置設(shè)置
16.2、更改時的通知
NSString *const AVCaptureDeviceSubjectAreaDidChangeNotification;
當AVCaptureDevice實例檢測到視頻主題區(qū)域發(fā)生重大變化時發(fā)送通知。
客戶端可以觀察AVCaptureDeviceSubjectAreaDidChangeNotification以了解AVCaptureDevice的實例何時檢測到視頻主題區(qū)域的實質(zhì)性變化。
僅當subjectAreaChangeMonitoringEnabled為YES時才會發(fā)送此通知。
17、管理白平衡
17.1、什么是白平衡?
白平衡,字面上的理解是白色的平衡。通過它可以解決色彩還原和色調(diào)處理的一系列問題。它是實現(xiàn)攝像機圖像能精確反映被攝物的色彩狀況,有手動白平衡和自動白平衡等方式。許多人在使用數(shù)碼攝像機拍攝的時候都會遇到這樣的問題:在日光燈的房間里拍攝的影像會顯得發(fā)綠,在室內(nèi)鎢絲燈光下拍攝出來的景物就會偏黃,而在日光陰影處拍攝到的照片則莫名其妙地偏藍,其原因就在于白平衡的設(shè)置上。
我們可以使用以下屬性獲取AVCaptureDevice當前是否正在調(diào)整白平衡:
@property(nonatomic, readonly, getter=isAdjustingWhiteBalance) BOOL adjustingWhiteBalance;
17.2、白平衡模式AVCaptureWhiteBalanceMode
@property(nonatomic) AVCaptureWhiteBalanceMode whiteBalanceMode;
我們可以使用該屬性獲取或者設(shè)置目前的白平衡模式;在更改此屬性的值之前,必須調(diào)用-lockForConfiguration:以獲得對設(shè)備配置屬性的訪問權(quán)。
AVCaptureWhiteBalanceMode 用于指定捕獲設(shè)備的白平衡模式的枚舉。
| 枚舉 | 描述 |
|---|---|
AVCaptureWhiteBalanceModeLocked |
白平衡設(shè)置已鎖定。 |
AVCaptureWhiteBalanceModeAutoWhiteBalance |
設(shè)備現(xiàn)在執(zhí)行自動白平衡操作。 |
AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance |
該設(shè)備可持續(xù)監(jiān)控白平衡并在必要時進行調(diào)整。 |
當然,我們在設(shè)置白平衡模式AVCaptureWhiteBalanceMode時,需要確定設(shè)備是否支持指定的模式
- (BOOL)isWhiteBalanceModeSupported:(AVCaptureWhiteBalanceMode)whiteBalanceMode;
該方法返回一個布爾值,指示是否支持給定的白平衡模式。如果支持whiteBalanceMode,則為YES,否則為NO。
17.3、白平衡增益AVCaptureWhiteBalanceGains
@property(nonatomic, readonly) float maxWhiteBalanceGain;
一個只讀屬性,最大的白平衡增益;該值在對象的生命周期內(nèi)不會更改。
typedef struct {
float redGain; //白平衡值的紅色增益分量。
float greenGain; //白平衡值的綠色增益分量。
float blueGain; //白平衡值的藍色增益分量。
} AVCaptureWhiteBalanceGains
包含RGB白平衡增益值的結(jié)構(gòu),對于該結(jié)構(gòu)中的每個成員,僅支持1.0和maxWhiteBalanceGain之間的值。如果結(jié)構(gòu)成員設(shè)置為不受支持的值,則此方法拋出NSInvalidArgumentException異常。
@property(nonatomic, readonly) AVCaptureWhiteBalanceGains deviceWhiteBalanceGains;
獲取白平衡增益。這些值可用于調(diào)整給定場景的色偏。無論白平衡模式如何,都可以隨時讀取該值。
我們可以使用下述方利用指定的deviceWhiteBalanceGains值將白平衡設(shè)置為鎖定模式。
- (void)setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:(AVCaptureWhiteBalanceGains)whiteBalanceGains
completionHandler:(void (^)(CMTime syncTime))handler;
該方法有兩個參數(shù):
- 參數(shù)
whiteBalanceGains: 白平衡增加到設(shè)定。表示當前白平衡設(shè)置的結(jié)構(gòu)常量AVCaptureWhiteBalanceGainsCurrent將白平衡增益鎖定為其當前值,即禁用自動白平衡。如果將whiteBalanceGains設(shè)置為不支持的級別,則此方法拋出異常NSInvalidArgumentException。 - 參數(shù)
handler:當白平衡增益已設(shè)置為指定值且whiteBalanceMode屬性為AVCaptureWhiteBalanceModeLocked時要調(diào)用的塊。 該塊接收與已應(yīng)用所有設(shè)置的第一個緩沖區(qū)匹配的時間戳。 時間戳與設(shè)備時鐘同步,因此必須先轉(zhuǎn)換為主時鐘,然后再與通過AVCaptureVideoDataOutput實例傳送的緩沖區(qū)的時間戳進行比較。如果不需要同步,則此參數(shù)可以為nil。
調(diào)用該方法時,如果lockingWhiteBalanceWithCustomDeviceGainsSupported屬性為NO,使用除AVCaptureWhiteBalanceGainsCurrent之外的白平衡增益值會引發(fā)異常。
在調(diào)用此方法之前,必須調(diào)用-lockForConfiguration:以獲得對設(shè)備配置屬性的訪問權(quán)。
@property(nonatomic, readonly, getter=isLockingWhiteBalanceWithCustomDeviceGainsSupported) BOOL lockingWhiteBalanceWithCustomDeviceGainsSupported;
指示設(shè)備是否支持將白平衡鎖定到特定增益值的布爾值。
@property(nonatomic, readonly) AVCaptureWhiteBalanceGains grayWorldDeviceWhiteBalanceGains;
中性灰色白點所需的當前設(shè)備特定白平衡值。該屬性指定從當前場景派生的當前紅色,綠色和藍色增益值,以提供白平衡的中性(或灰色世界)白點。
灰色世界值假定中間主體(例如灰卡)已放置在主題區(qū)域的中間并填充幀的中心50%。 客戶端可以使用-setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler:讀取這些值并將其應(yīng)用于設(shè)備。
17.4、CIE 1931色度坐標系
包含CIE 1931色度坐標的結(jié)構(gòu):
typedef struct {
float x;//表示與紅色有關(guān)的相對量值,值范圍介于0到0.8之間。
float y;//表示與綠色有關(guān)的相對量值,值范圍介于0和0.85之間。
} AVCaptureWhiteBalanceChromaticityValues
使用下述方法將白平衡增益AVCaptureWhiteBalanceGains轉(zhuǎn)換為 CIE 1931色度坐標系,進行白平衡色度調(diào)節(jié)
- (AVCaptureWhiteBalanceChromaticityValues)chromaticityValuesForDeviceWhiteBalanceGains:(AVCaptureWhiteBalanceGains)whiteBalanceGains;
該方法的參數(shù)與返回值:
- 參數(shù)
whiteBalanceGains:白平衡增益值。 可能不使用AVCaptureWhiteBalanceGainsCurrent的值。 - 返回值:包含CIE 1931色度坐標的結(jié)構(gòu)
使用下述方法將 CIE 1931色度坐標系轉(zhuǎn)換為白平衡增益AVCaptureWhiteBalanceGains:
- (AVCaptureWhiteBalanceGains)deviceWhiteBalanceGainsForChromaticityValues:(AVCaptureWhiteBalanceChromaticityValues)chromaticityValues;
注意:某些 chromaticityValues字段組合產(chǎn)生超出范圍的設(shè)備RGB值,如果直接傳遞給 -setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:completionHandler:將導致拋出異常。務(wù)必檢查紅色,綠色和藍色增益值是否在 [1.0 - maxWhiteBalanceGain]的范圍內(nèi)。
17.5、溫度和色彩度的白平衡調(diào)節(jié)
含有與白平衡色相關(guān)的溫度和色彩值的結(jié)構(gòu)
typedef struct {
float temperature; //以開爾文表示的白平衡色相關(guān)溫度。
float tint; //白平衡色彩值在-150.0到+150.0之間。
} AVCaptureWhiteBalanceTemperatureAndTintValues
我們可以調(diào)用下述方法獲取當前白平衡增益AVCaptureWhiteBalanceGains下的溫度和色彩度
- (AVCaptureWhiteBalanceTemperatureAndTintValues)temperatureAndTintValuesForDeviceWhiteBalanceGains:(AVCaptureWhiteBalanceGains)whiteBalanceGains;
該方法的參數(shù)與返回值:
參數(shù) whiteBalanceGains:包含RGB白平衡增益值的結(jié)構(gòu);可以不使用AVCaptureWhiteBalanceGainsCurrent的值。
返回值: 返回一個含有與白平衡色相關(guān)的溫度和色彩值的結(jié)構(gòu)
18、管理高動態(tài)范圍視頻
| 屬性 | 類型 | 描述 |
|---|---|---|
automaticallyAdjustsVideoHDREnabled |
BOOL |
指示是否允許AVCaptureDevice打開或關(guān)閉高動態(tài)范圍流,默認值為YES。 |
videoHDREnabled |
BOOL |
指示是否允許接收器打開或關(guān)閉高動態(tài)范圍流,默認值為YES。 |
默認情況下,當客戶端使用activeFormat屬性設(shè)置新格式時,AVCaptureDevice始終將videoHDREnabled設(shè)置為NO。
當客戶端使用AVCaptureSession屬性sessionPreset時,AVCaptureDevice會自動打開視頻HDR,如果它非常適合預設(shè)??蛻舳丝梢允褂?code>videoHDREnabled屬性的鍵值觀察來了解接收器何時自動更改了值。
如果在沒有調(diào)用-lockForConfiguration:鎖定 AVCaptureDevice的情況下設(shè)置此屬性,則拋出NSGenericException異常。
19、管理顏色空間
@property(nonatomic) AVCaptureColorSpace activeColorSpace;
管理色彩空間,當前活動的色彩空間用于捕獲。
所有設(shè)備和格式都支持sRGB色彩空間中的捕獲。某些設(shè)備和格式也可以在P3色彩空間中捕捉,其中包括比sRGB色彩空間寬得多的色域。默認情況下,AVCaptureSession會自動為受支持的設(shè)備捕獲寬色域捕獲并捕獲工作流;
為獲得最佳效果,請在AVCaptureSession上調(diào)用-startRunning之前選擇一個顏色空間。在AVCaptureSession運行時更改此屬性需要對捕獲渲染管道進行破壞性重新配置,正在進行的影片捕獲將立即結(jié)束,未實現(xiàn)的照片請求將中止,并且視頻預覽將暫時凍結(jié)。
如果在沒有調(diào)用-lockForConfiguration:鎖定 AVCaptureDevice的情況下設(shè)置此屬性,則拋出NSGenericException異常。
AVCaptureColorSpace用于指定用于圖像和視頻捕獲的色域和格式的枚舉,與activeColorSpace屬性一起使用。默認情況下,AVCaptureSession類自動為受支持的設(shè)備和捕獲工作流啟用寬色域捕獲。
| 枚舉值 | 描述 |
|---|---|
AVCaptureColorSpace_sRGB |
標準RGB色彩空間。 |
AVCaptureColorSpace_P3_D65 |
數(shù)字影院標準DCI-P3色彩空間,帶有CIE D65標準白點。 |
20、處理系統(tǒng)壓力變化
20.1、狀態(tài)信息systemPressureState
@property(nonatomic, readonly) AVCaptureSystemPressureState *systemPressureState;
影響捕獲系統(tǒng)性能和可用性的操作系統(tǒng)和硬件狀態(tài)的當前狀態(tài)。當前的操作系統(tǒng)和硬件狀態(tài)影響捕獲系統(tǒng)的性能和可用性。
AVCaptureSystemPressureState 有關(guān)影響捕獲系統(tǒng)性能和可用性的OS和硬件狀態(tài)的信息。
iOS 設(shè)備上的攝像頭捕獲系統(tǒng)的性能和可用性受到多種外部因素的影響,例如電源使用和設(shè)備溫度。如果在捕獲會話期間總系統(tǒng)壓力達到過高水平,則捕獲系統(tǒng)會自動關(guān)閉,從而導致會話中斷。在較輕的壓力下,系統(tǒng)可以自動降低捕獲質(zhì)量。
要避免此類中斷,需要使用KVO來監(jiān)視AVCaptureDevice上systemPressureState屬性的值,并在系統(tǒng)壓力增加時采取措施降低捕獲會話的性能影響;例如,通過降低捕獲幀速率。
20.2、總體水平level
@property(atomic, readonly) AVCaptureSystemPressureLevel level;
捕獲系統(tǒng)性能約束的整體表征。操作系統(tǒng)和硬件狀態(tài)的幾個方面會影響捕獲系統(tǒng)的性能和可用性。整體系統(tǒng)壓力水平代表最關(guān)鍵的潛在因素。
typedef NSString *AVCaptureSystemPressureLevel; 表示系統(tǒng)壓力水平的結(jié)構(gòu)
| 值 | 描述 |
|---|---|
AVCaptureSystemPressureLevelNominal |
系統(tǒng)壓力水平正常(未加壓)。 |
AVCaptureSystemPressureLevelFair |
系統(tǒng)壓力略有升高。 |
AVCaptureSystemPressureLevelSerious |
系統(tǒng)壓力大大提高。 捕獲性能可能會受到影響。 建議采用幀率限制。 |
AVCaptureSystemPressureLevelCritical |
系統(tǒng)壓力嚴重升高。 捕獲質(zhì)量和性能受到顯著影響。 強烈建議使用幀速率限制。 |
AVCaptureSystemPressureLevelShutdown |
系統(tǒng)壓力超出臨界值,因此捕獲系統(tǒng)已關(guān)閉。當系統(tǒng)壓力達到此水平時,捕獲系統(tǒng)會自動關(guān)閉,從而導致會話中斷。在中斷通知的userInfo字典中使用AVCaptureSessionInterruptionSystemPressureStateKey來查找導致中斷的系統(tǒng)壓力因素的詳細信息。 |
20.3、影響因素
@property(atomic, readonly) AVCaptureSystemPressureFactors factors;
系統(tǒng)壓力水平的一系列根本原因。系統(tǒng)壓力水平較高時,可以使用此信息選擇如何緩解問題。
例如,在多鏡頭設(shè)備上由于AVCaptureSystemPressureFactorDepthModuleTemperature導致的高系統(tǒng)壓力可以通過限制深度捕獲幀速率來減少。
AVCaptureSystemPressureFactors 影響捕獲系統(tǒng)性能的一組因素。如果系統(tǒng)壓力級別為AVCaptureSystemPressureLevelNominal(即捕獲系統(tǒng)性能不受其他OS和硬件因素的影響),則此值為空集。
| 值 | 描述 |
|---|---|
AVCaptureSystemPressureFactorNone |
系統(tǒng)壓力目前是標稱值。 |
AVCaptureSystemPressureFactorSystemTemperature |
整個系統(tǒng)的熱負荷都很高。 |
AVCaptureSystemPressureFactorPeakPower |
系統(tǒng)的峰值功率要求超過了電池的當前容量。具有化學老化電池的設(shè)備不太能夠響應(yīng)總功率使用(CPU和GPU使用,I/O,相機系統(tǒng),無線電等)的快速增加。當設(shè)備檢測到這種情況時,可能會限制捕獲系統(tǒng)性能,以防止意外的設(shè)備關(guān)閉。 |
AVCaptureSystemPressureFactorDepthModuleTemperature |
捕獲深度信息的模塊在升高的溫度下操作。隨著系統(tǒng)壓力的增加,深度質(zhì)量可能會降低。要從此因素降低系統(tǒng)壓力,需要降低深度捕獲幀速率。此因素僅適用于多鏡頭設(shè)備。 |