AVFoundation是一個很是酷的框架,容許您收集多媒體數據所產生的不一樣的輸入源(攝像頭、麥克風等)和將他們重定向到任何輸出目的地(屏幕、揚聲器等)。您能夠建立自定義播放和捕獲音頻解決方案,視頻和靜態圖像。使用這個框架的優點對於商用解決方案如MPMoviePlayerController或UIImagePickerController是你得到相機的原始數據。經過這種方式,您能夠應用效果實時輸入信號的不一樣的目的。web
我爲你準備了一個小應用程序,向您展現如何使用這個框架,並建立一個很酷的攝像機。算法
AVFoundation基於會話的概念。會話是用於控制流數據從輸入到輸出的設備。建立一個會話很簡單:session
AVCaptureSession *session = [[AVCaptureSession alloc] init];
會話容許您定義音頻和視頻記錄的質量,使用sessionPreset AVCaptureSession類的屬性。對於這個示例,它很好去低質量數據(因此咱們節省一些電池循環):框架
[session setSessionPreset:AVCaptureSessionPresetLow];
捕獲會話建立後,您須要定義獲取您想要使用的設備。它能夠攝像頭或麥克風。在本例中,我將使用AVMediaTypeVideo類型,支持視頻和圖片:ide
AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
下一步,您須要定義的輸入捕捉裝置,並將它添加到會話。給你:post
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error]; if ( [session canAddInput:deviceInput] ) [session addInput:deviceInput];
你檢查是否能夠添加設備輸入會話,若是能夠,您添加它動畫
定義設備的輸出以前,我想向您展現如何預覽攝像機緩衝區。這將是你的相機的取景器,即輸入設備的是看到的預覽。
咱們能夠快速呈現原始數據收集的相機使用AVCaptureVideoPreviewLayer在屏幕上。咱們可使用上面定義的會話咱們建立這個預覽層,而後將它添加到咱們的主要視圖層:spa
AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; CALayer *rootLayer = [[self view] layer]; [rootLayer setMasksToBounds:YES]; [previewLayer setFrame:CGRectMake(-70, 0, rootLayer.bounds.size.height, rootLayer.bounds.size.height)]; [rootLayer insertSublayer:previewLayer atIndex:0];
你不須要作任何額外的工做。你如今能夠在你的屏幕上顯示攝像機信號。
若是你想作一些更酷的東西,例如,若是你想處理攝像頭信號建立好的視頻效果與核心形象或加速框架(給看看這篇文章),您須要收集原始數據生成的相機,處理它們,,若是你喜歡它,它們顯示在屏幕上。code
咱們已經準備好去。您須要作的最後一件事是開始會話:視頻
[session startRunning];
因爲AVCaptureVideoPreviewLayer是一層,顯然能夠添加動畫。我在這裏將一個很是簡單的Xcode項目顯示前面的概念。它建立一個定製的攝像機預覽旋轉的三維空間。
若是你想作一些圖像處理的原始數據被相機並將結果顯示在屏幕上,您須要收集這些數據,處理他們,使他們在屏幕上不使用AVCaptureVideoPreviewLayer。根據你想實現什麼,您有兩個主要策略:
一、要麼你捕獲靜止畫面就須要一個
二、你捕捉連續視頻緩衝區
如今,第一種方法是最簡單的一個:每當你須要知道相機正在看,你只拍一張照片。相反,若是你想視頻緩衝過程,更棘手的,特別是當你的圖像處理算法比相機幀速率慢輸出。在這裏,你須要評估的解決方案更適合你。考慮,這取決於設備你能夠獲得不一樣的圖像分辨率。例如,iPhone 4 s能夠提供8萬像素的圖像。如今,大量的實時數據處理。因此,若是你正在作實時圖像處理,你須要接受一些低質量的圖像。