
上圖是使用捕捉功能時(shí)可能用到的一些類(lèi)和它們的關(guān)系
捕捉會(huì)話捕捉設(shè)備
AVCaptureSession
管理類(lèi),連接輸入輸出
AVCaptureDevice
AVCaptureDevice 定義了大量的方法用于訪問(wèn)系統(tǒng)的捕捉設(shè)備(例如攝像頭)提供了控制攝像頭的對(duì)焦 白平衡 閃光燈....的方法。
捕捉輸入AVCaptureDeviceInput
如最上圖所示,AVCaptureDevice要裝在一個(gè)AVCaptureDeviceInput里面才能添加到AVCaptureSession中
當(dāng)創(chuàng)建AVCaptureDeviceInput對(duì)象的時(shí)候,系統(tǒng)會(huì)彈出警告框詢問(wèn)“是否允許使用攝像頭”,這時(shí)候系統(tǒng)內(nèi)部其實(shí)已經(jīng)返回了一個(gè)AVCaptureDeviceInput對(duì)象,只是在用戶同意之前,返回的是靜音設(shè)備或者相機(jī)黑白幀,知道用戶同意之后才正常工作。如果這時(shí)候用戶點(diǎn)擊不允許,則本次會(huì)話期間AVCaptureDeviceInput不會(huì)記錄任何能容,下次重啟app時(shí)候,AVCaptureDeviceInput創(chuàng)建時(shí)候會(huì)返回一個(gè)nil,然后就會(huì)收到NSError消息,這時(shí)候最好彈出一個(gè)提示框告訴用戶。
捕捉輸出AVCaptureStillImageOutput、 AVCaptureMovieFileOutput
如最上圖所示,AVCaptureStillImageOutput和AVCaptureMovieFileOutput是抽象類(lèi)AVCaptureOutput的高級(jí)擴(kuò)展類(lèi),使用它們可以很容易的實(shí)現(xiàn)捕捉靜態(tài)圖片和視頻的功能,也可以使用AVCaptureAudioDataOutput活著AVCaptureVideoDataOutput實(shí)現(xiàn)更高級(jí)也更底層的功能。
捕捉連接AVCaptureConnection
當(dāng)把一個(gè)輸入和輸出添加到AVCaptureSession之后,
AVCaptureSession就會(huì)在輸入、輸出設(shè)備之間建立連接,而且通過(guò)AVCaptureConnection可以獲取這個(gè)連接對(duì)象
捕捉預(yù)覽AVCaptureVideoPreviewLayer
AVCaptureVideoPreviewLayer:相機(jī)拍攝預(yù)覽圖層,也是core animation的calayer子類(lèi),和AVPlayerLayer類(lèi)似。能實(shí)時(shí)查看拍照或視頻錄制效 果,創(chuàng)建該對(duì)象需要指定對(duì)應(yīng)的AVCaptureSession對(duì)象,因?yàn)锳VCaptureSession包含視頻輸入數(shù)據(jù),有視頻數(shù)據(jù)才能展示。
最簡(jiǎn)單的demo
- (void)viewDidLoad {
[super viewDidLoad];
AVCaptureSession *session = [[AVCaptureSession alloc]init];
AVCaptureDevice *devive = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = [NSError errorWithDomain:NSLocalizedDescriptionKey code:1 userInfo:@{@"info":@"出錯(cuò)了"}];
AVCaptureDeviceInput *cameraInput = [AVCaptureDeviceInput deviceInputWithDevice:devive error:&error];
if ([session canAddInput:cameraInput]) {
[session addInput:cameraInput];
}
AVCaptureStillImageOutput *output = [[AVCaptureStillImageOutput alloc]init];
if ([session canAddOutput:output]) {
[session addOutput:output];
}
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:session];
layer.frame = self.view.frame;
[self.view.layer addSublayer:layer];
[session startRunning];
}
使用以上概念可以做出一個(gè)最簡(jiǎn)單的顯示攝像頭畫(huà)面的demo:
