iOS - 硬件配置相關 - AVCaptureDevice

最近因爲需要做二維碼的功能,所以接觸到這個類,
AVCaptureDevice.h,主要用來獲取iphone一些關於相機設備的屬性。
使用這個類必須要引入AVFoundation.framework包。

前置和後置攝像頭

enum {
    AVCaptureDevicePositionBack = 1,
    AVCaptureDevicePositionFront = 2
};
typedef NSInteger AVCaptureDevicePosition;

閃光燈開關

enum {
    AVCaptureFlashModeOff = 0,
    AVCaptureFlashModeOn = 1,
    AVCaptureFlashModeAuto = 2
};
typedef NSInteger AVCaptureFlashMode;

手電筒開關

enum {
    AVCaptureTorchModelOff = 0,
    AVCaptureTorchModelOn = 1,
    AVCaptureTorchModeAuto = 2
};
typedef NSInteger AVCaptureTorchMode;

焦距調整

enum {
    AVCaptureFocusModelLocked = 0,
    AVCaptureFocusModeAutoFocus = 1,
    AVCaptureFocusModeContinousAutoFocus = 2
};
typedef NSInteger AVCaptureFocusMode;

曝光量調節

enum {
    AVCaptureExposureModeLocked = 0,
    AVCaptureExposureModeAutoExpose = 1,
    AVCaptureExposureModeContinuousAutoExposure = 2
};
typedef NSInteger AVCaptureExposureMode;

白平衡

enum {
    AVCaptureWhiteBalanceModeLocked = 0,
    AVCaptureWhiteBalanceModeAutoWhiteBalance = 1,
    AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance = 2
};
typedef NSInteger AVCaptureWhiteBalanceMode;

媒體採集的幾個東西。這裏所需要明白的是,在這個流程中,這裏會存在幾個對象:
a、AVCaptureDevice。這裏代表抽象的硬件設備。
b、AVCaptureInput。這裏代表輸入設備(可以是它的子類),它配置抽象硬件設備的ports。
c、AVCaptureOutput。它代表輸出數據,管理着輸出到一個movie或者圖像。
d、AVCaptureSession。它是input和output的橋樑。它協調着intput到output的數據傳輸。

1、之間的關係:
高層面關係:

有很多Device的input,也有很多數據類型的Output,都通過一個Capture Session來控制進行傳輸。也即:CaptureDevice適配AVCaptureInput,通過Session來輸入到AVCaptureOutput中。這樣也就達到了從設備到文件等持久化傳輸的目的(如從相機設備採集圖像到UIImage中)。

特別注意,這裏的關係是可以通過唯一一個Capture Session來同時控制設備的輸入和輸出。

那麼存在一個問題了:視頻輸入(input)就對應視頻的輸出(output),而音頻輸入就應對應音頻的輸出,因而需要建立對應的Connections,來各自連接它們。而這樣的連接對象,是由AVCaptureSession來持有的,這個對象叫AVCaptureConnection。

在一個ACCaptureConnection中,這裏維持着對應的數據傳輸輸入到數據輸出的過程(detail過程)。這裏,AVCaptureInput或其子類對象包含着各種input port,通過各種input port,我們的AVCaptureOutput可以獲取到相應的數據。

一個ACCaptureConnection可以控制input到output的數據傳輸。

2、Session及其使用模式

You use an instance to coordinate the flow of data from AV input devices to outputs. You add the capture devices and outputs you want to the session, then start data flow by sending the session a startRunning message, and stop recording by sending a stopRunning message.

AVCaptureSession *session = [[AVCaptureSession alloc] init];

//Add inputs and outputs.

[session startRunning];

這裏表明了,需要create一個session,然後發running消息給它,它會自動跑起來,把輸入設備的東西,提交到輸出設備中。

若想在一個已經使用上的session中(已經startRunning了)做更換新的device、刪除舊的device等一系列操作,那麼就需要使用如下方法:

[session beginConfiguration];

// Remove an existing capture device.

// Add a new capture device.

// Reset the preset.

[session commitConfiguration];

來進行處理。

當然,如果session的時候發生了異常,那麼我們可以通過notification去observe相關的事件(可以在AVCaptureSession Class Reference中的Nofications中找到相應的情況),而session如果出現相應問題時,它會post出來,此時我們就可以處理了。

3、談談AVCaptureDevice

InputDevice即是對硬件的抽象,一對一的。一個AVCaptureDevice對象,對應一個實際的硬件設備。

那麼顯然,我們可以通過AVCaptureDevice的類方法devices或devicesWithMediaType去獲取全部或局部設備列表。(當然也可以檢測相應的設備是否可以使用,這裏注意有設備搶佔問題,當前是否可用)

相機設備可以用下面的方法判斷設備是否支持相關屬性(property),比如對焦方式或者對焦狀態Focus modes。

if([currentDeviceisFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus])

此外,設置對焦點CGPoint時,需要注意位置:

a CGPoint where {0,0} represents the top left of the picture area, and {1,1} represents the bottom right in landscape mode with the home button on the right。

當我們需要對一個設備的屬性進行觀察,我們可以使用KVO來處理。(爲啥觀察,比如我們需要知道設備此時是否正在對焦or已經停止了對焦)

對於一個device的屬性更改,我們的做法通常是:
lockàsetàunlock

if([deviceisFocusModeSupported:AVCaptureFocusModeLocked])

//do configuring

[device unlockForConfiguration];

}

else{//Respond to the failure as appropriate.

4、CaptureInput的構建和添加到Session中的方法

/創建並配置輸入設備/

AVCaptureDevice *device =

[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

NSError *error = nil;

AVCaptureDeviceInput *input =

[AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

//添加input到session的模式是(檢查可否添加到session,然後根據情況添加或者不添加):

AVCaptureSession *captureSession = <#Get a capture session#>;

if ([captureSession canAddInput:input]) {

[captureSession addInput:captureDeviceInput];

}

else{//handle the failure.}

5、output的分類和使用

在ios中,分爲MovieFile、VideoData、AudioData和StillImage幾種output,使用方式類似,只是範圍不同。另外,它們都繼承於AVCaptureOutput。

第一個是輸出成movie文件,第二個適用於逐個Frame的處理,第三個適用於聲音採集,第四個是still image(靜態圖像<拍照>)相關。

他們的添加方式都是使用session的addOutput方法。

本文是轉載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章