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