AVFoundation之?dāng)z像頭

1.png

上圖是使用捕捉功能時(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:


491DC701ABB666041F0ACC97DF20076D.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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