OC之AVCaptureDevice續(xù)

OC之AVCaptureDevice

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)用于信號的增益值返回傳感器對光的靈敏度。

僅支持minISOmaxISO之間的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 一個只讀屬性,表示曝光時間;僅支持minExposureDurationmaxExposureDuration之間的曝光持續(xù)時間值。無論曝光模式如何,都可以隨時讀取曝光時間。
exposureTargetOffset float 一個只讀屬性,表示當前場景的計量曝光水平與目標曝光值之間的差異;以EV為單位。
exposureTargetBias float 一個只讀屬性,以EV單位應(yīng)用于目標暴露值的偏差。當曝光模式為AVCaptureExposureModeAutoExposeAVCaptureExposureModeLocked時,偏差將影響測光(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屬性的minExposureDurationmaxExposureDuration范圍中的任何值。會話運行時會立即反映更改,而不會重建圖形。
還可以將屬性設(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è)置為AVCaptureExposureModeAutoExposeAVCaptureExposureModeContinuousAutoExposure。

此屬性的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 將曝光時間鎖定為其當前值,即禁用自動曝光。注意,對此屬性的更改可能會導致activeVideoMinFrameDurationactiveVideoMaxFrameDuration發(fā)生更改。

  • 參數(shù)float ISO : 表示感光度。常量AVCaptureISOCurrent的值可用于指示調(diào)用者不希望為ISO指定值,而是應(yīng)將其設(shè)置為其當前值。

  • 參數(shù)handler :當曝光時間exposureDuration和感光度ISO都已設(shè)置為指定值且曝光模式exposureModeAVCaptureExposureModeCustom時的回調(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ì)性變化。

僅當subjectAreaChangeMonitoringEnabledYES時才會發(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.0maxWhiteBalanceGain之間的值。如果結(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)視AVCaptureDevicesystemPressureState屬性的值,并在系統(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è)備。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容