這個(gè)欄目主要開(kāi)放出來(lái),研究一下攝像頭這塊,系統的研究一下,可能會(huì )涉及到相冊,拍照等等,由于這塊還是挺重要的,所以單獨作為一個(gè)模塊系統的學(xué)習。
看一下幾個(gè)屬性吧
- AVCaptureDevice.h,主要用來(lái)獲取iphone一些關(guān)于相機設備的屬性。
-
- AVCaptureDevice.h,必須要引入AVFoundation.framework包。
-
- 1. 前置和后置攝像頭
- enum {
- AVCaptureDevicePositionBack = 1,
- AVCaptureDevicePositionFront = 2
- };
- typedef NSInteger AVCaptureDevicePosition;
-
- 2. 閃光燈開(kāi)關(guān)
- enum {
- AVCaptureFlashModeOff = 0,
- AVCaptureFlashModeOn = 1,
- AVCaptureFlashModeAuto = 2
- };
- typedef NSInteger AVCaptureFlashMode;
-
- 3. 手電筒開(kāi)關(guān)
- enum {
- AVCaptureTorchModelOff = 0,
- AVCaptureTorchModelOn = 1,
- AVCaptureTorchModeAuto = 2
- };
- typedef NSInteger AVCaptureTorchMode;
-
- 4. 焦距調整
- enum {
- AVCaptureFocusModelLocked = 0,
- AVCaptureFocusModeAutoFocus = 1,
- AVCaptureFocusModeContinousAutoFocus = 2
- };
- typedef NSInteger AVCaptureFocusMode;
-
- 5. 曝光量調節
- enum {
- AVCaptureExposureModeLocked = 0,
- AVCaptureExposureModeAutoExpose = 1,
- AVCaptureExposureModeContinuousAutoExposure = 2
- };
- typedef NSInteger AVCaptureExposureMode;
-
- 6. 白平衡
- enum {
- AVCaptureWhiteBalanceModeLocked = 0,
- AVCaptureWhiteBalanceModeAutoWhiteBalance = 1,
- AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance = 2
- };
- typedef NSInteger AVCaptureWhiteBalanceMode;
0、媒體采集的幾個(gè)東西。這里所需要明白的是,在這個(gè)流程中,這里會(huì )存在幾個(gè)對象:
a、AVCaptureDevice。這里代表抽象的硬件設備。
b、AVCaptureInput。這里代表輸入設備(可以是它的子類(lèi)),它配置抽象硬件設備的ports。
c、AVCaptureOutput。它代表輸出數據,管理著(zhù)輸出到一個(gè)movie或者圖像。
d、AVCaptureSession。它是input和output的橋梁。它協(xié)調著(zhù)intput到output的數據傳輸。
1、這些東東的關(guān)系。
高層面關(guān)系:
有很多Device的input,也有很多數據類(lèi)型的Output,都通過(guò)一個(gè)Capture Session來(lái)控制進(jìn)行傳輸。也即:CaptureDevice適配AVCaptureInput,通過(guò)Session來(lái)輸入到AVCaptureOutput中。這樣也就達到了從設備到文件等持久化傳輸的目的(如從相機設備采集圖像到UIImage中)。
特別注意,這里的關(guān)系是可以通過(guò)唯一一個(gè)Capture Session來(lái)同時(shí)控制設備的輸入和輸出。
那么存在一個(gè)問(wèn)題了:視頻輸入(input)就對應視頻的輸出(output),而音頻輸入就應對應音頻的輸出,因而需要建立對應的Connections,來(lái)各自連接它們。而這樣的連接對象,是由AVCaptureSession來(lái)持有的,這個(gè)對象叫AVCaptureConnection。
在一個(gè)ACCaptureConnection中,這里維持著(zhù)對應的數據傳輸輸入到數據輸出的過(guò)程(detail過(guò)程)。這里,AVCaptureInput或其子類(lèi)對象包含著(zhù)各種input port,通過(guò)各種input port,我們的AVCaptureOutput可以獲取到相應的數據。
一個(gè)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一個(gè)session,然后發(fā)running消息給它,它會(huì )自動(dòng)跑起來(lái),把輸入設備的東西,提交到輸出設備中。
若想在一個(gè)已經(jīng)使用上的session中(已經(jīng)startRunning了)做更換新的device、刪除舊的device等一系列操作,那么就需要使用如下方法:
[session beginConfiguration];
// Remove an existing capture device.
// Add a new capture device.
// Reset the preset.
[session commitConfiguration];
來(lái)進(jìn)行處理。
當然,如果session的時(shí)候發(fā)生了異常,那么我們可以通過(guò)notification去observe相關(guān)的事件(可以在A(yíng)VCaptureSession Class Reference中的Nofications中找到相應的情況),而session如果出現相應問(wèn)題時(shí),它會(huì )post出來(lái),此時(shí)我們就可以處理了。
3、談?wù)凙VCaptureDevice
InputDevice即是對硬件的抽象,一對一的。一個(gè)AVCaptureDevice對象,對應一個(gè)實(shí)際的硬件設備。
那么顯然,我們可以通過(guò)AVCaptureDevice的類(lèi)方法devices或devicesWithMediaType去獲取全部或局部設備列表。(當然也可以檢測相應的設備是否可以使用,這里注意有設備搶占問(wèn)題,當前是否可用)
相機設備可以用下面的方法判斷設備是否支持相關(guān)屬性(property),比如對焦方式或者對焦狀態(tài)Focus modes。
if([currentDeviceisFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus])
此外,設置對焦點(diǎn)CGPoint時(shí),需要注意位置:
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。
當我們需要對一個(gè)設備的屬性進(jìn)行觀(guān)察,我們可以使用KVO來(lái)處理。(為啥觀(guān)察,比如我們需要知道設備此時(shí)是否正在對焦or已經(jīng)停止了對焦)
對于一個(gè)device的屬性更改,我們的做法通常是:
lockàsetàunlock
if([deviceisFocusModeSupported:AVCaptureFocusModeLocked])
//do configuring
[device unlockForConfiguration];
}
else{//Respond to the failure as appropriate.
4、CaptureInput的構建和添加到Session中的方法
/*創(chuàng )建并配置輸入設備*/
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的分類(lèi)和使用
在ios中,分為MovieFile、VideoData、AudioData和StillImage幾種output,使用方式類(lèi)似,只是范圍不同。另外,它們都繼承于A(yíng)VCaptureOutput。
第一個(gè)是輸出成movie文件,第二個(gè)適用于逐個(gè)Frame的處理,第三個(gè)適用于聲音采集,第四個(gè)是still image(靜態(tài)圖像<拍照>)相關(guān)。
他們的添加方式都是使用session的addOutput方法。
原文:http://blog.163.com/chester_lp/blog/static/139794082012119112834437/