關(guān)于AVFoundation
AVFoundation是一個可以用來使用和創(chuàng)建基于時間的視聽媒體的框架算撮,它提供了一個能使用基于時間的視聽數(shù)據(jù)的詳細(xì)級別的Objective-C接口。例如:您可以用它來檢查县昂,創(chuàng)建肮柜,編輯或是重新編碼媒體文件。也可以從設(shè)備中獲取輸入流倒彰,在視頻實時播放時操作和回放审洞。下圖時AVFoundation在IOS中的架構(gòu)。
AVFoundation在IOS中的位置
AVFoundation在OS X中的位置
在使用時待讳,應(yīng)盡量使用最高級別的抽象的控件:
1.如果只是想播放視頻芒澜,應(yīng)該使用AVKit框架。
2.在IOS中创淡,如果只是想錄制視頻痴晦,可以使用UIKit框架(UIImagePickerController).
但是,值得注意的是琳彩,一些用在AV Foundation-including的基于時間數(shù)據(jù)結(jié)構(gòu)的原始數(shù)據(jù)結(jié)構(gòu)和帶有未公開的媒體數(shù)據(jù)描述的部分是聲明在Core Media框架的誊酌。
AVFoundation知識點
1.Using Assets [自己理解為:數(shù)據(jù)的來源]
這個資源可以來自自己的ipod媒體庫或圖片也可以時文件
創(chuàng)建一個Assets
NSRUL*url =//后跟一個網(wǎng)址 如電影文件等資源AVURLAsset*ansset = [[AVURLSsetalloc] initwithURL:url? options:nil];
2.獲得一個視頻的圖像
使用AVASsetImageGenerator類來實現(xiàn)
用來生成圖像序列
3.Playback
我們在播放視頻時可以使用AVPlayer和AVQueuePlayer播放,AVPlayer是AVQueuePlayer的父類
a.先創(chuàng)建一個路徑
b.可以使用AVPlayerItem加載路徑
c.使用AVPlayer播放文件
當(dāng)然我們還可以控制它的播放速度
使用rate屬性它是一個介于0.0--1.0之間的數(shù)
我們也可以播放多個項目 :
NSArray*items? =// 設(shè)置一個播放的組合AVQueuePlayer*queueplayer = [[AVQueuePlayeralloc]initwithItems:items]部凑;//然后使用AVPlayerItemAVPlayerItem*anItem = // get? a player item//使用canInsertItem:afterItem 測試
4.Media capture
我們可以配置預(yù)設(shè)圖片的質(zhì)量和分辨率
AVCaptureSessionPresetHigh? ? High? ? 最高的錄制質(zhì)量,每臺設(shè)備不同
AVCaptureSessionPresetMedium? Medium? ? 基于無線分享的碧浊,實際值可能會改變
AVCaptureSessionPresetLow? LOW? ? 基于3g分享的
AVCaptureSessionPreset640x480? ? 640x480? ? ? VGA
AVCaptureSessionPreset1280x720? ? 1280x720? ? 720p HD
AVCaptureSessionPresetPhoto? ? Photo? ? ? 完整的照片分辨率砚尽,不支持視頻輸出
判斷一個設(shè)備是否適用 :
AVCaptreSessuion*session = [[AVCaptureSessionalloc]init];if([session canSetSessionPreset:AVCaptureSessionPrese1280x720]){ session.sessionPreset=AVCaptureSessionPreset1280x720; }else{// Handle the failure.}
可以在 [session beginConfigration], [session commit configuration]中配置重新添加你想要適用的設(shè)備以及刪除以前的設(shè)備等操作 (詳解在6)。
5.當(dāng)我們不知道設(shè)備的一些特性時我們可以使用以下代碼查找相應(yīng)的設(shè)備
NSArray*devices = [AVCaptureDevicedevices];for(AVCaptureDevice*deviceindevice){NSLog("Device name %@",[devic localizedName]);//當(dāng)然還可以判斷設(shè)備的位置if([device hasMediaType:AVMediaTypeVideo]){if([device postion] ==AVCaptureDevicePostionBack){NSLog(@"Device postion :back"); }else{NSLog(@"Device postion :front"); } } }
下面的demo說明如何找到視頻輸入設(shè)備 :
NSArray*devices = [AVCaptureDevicedevicesWithMediaType:AVMediaTypeVideo];NSMutableArray*torchDevices =? [[NSMutableArrayalloc]init];for(AVCaptureDevice*deviceindevices){if([device hasTorch]&&[device supportsAVCaptureSessionPreset:AVCaptureSessionPreset640x480]){ [torchDevices addObject:device]; } }
6設(shè)備間切換
AVCaptureSession*session =//一個設(shè)備session[session beginConfiguration]; [session removeInput:frontFacingCameraDeviceInput]; [session AddInput:backFacikngCameraDeviceInput]; [session commitConfiguration];
7 配置AVCaptureDeviceInput
AVCaptureSession*captureSession = <#Get a capture session#>;AVCaptureDeviceInput*captureDeviceInput = <#Get a capture device input#>;// 檢查是否適用if([captureSession canAddInput:captureDeviceInput]) {// 適用則添加[captureSession addInput:captureDeviceInput]; }else{// Handle the failure.}
8 配置AVCaptureOutput
輸出的類型:
a.AVCaptureMovieFileOutput 輸出一個電影文件
b.AVCaptureVideoDataOutput 輸出處理視頻幀被捕獲
c.AVCaptureAudioDataOutput 輸出音頻數(shù)據(jù)被捕獲
d.AVCaptureStillImageOutput 捕獲元數(shù)據(jù)
AVCaptureSession*captureSession = <#Get a capture session#>;AVCaptureMovieFileOutput*movieInput = <#Create and configure a movie output#>;if([captureSession canAddOutput:movieInput]) { [captureSession addOutput:movieInput]; }else{// Handle the failure.}
9 保存到一個電影文件
AVCaptureMovieFileOutput *aMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; CMTime maxDuration = <#Create a CMTime to represent the maximum duration#>;aMovieFileOutput.maxRecordedDuration = maxDuration;? aMovieFileOutput.minFreeDiskSpaceLimit = <#An appropriate minimum given the quality of the movie format and the duration#>;
10 錄音設(shè)備
使用AVCaptureFileOutputRecordingDelegate代理而且必須實現(xiàn)方法:
captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error: method.
11 像素和編碼格式
iphone 3G? ? iphone 3GS? ? iphone 4
yuvs,2vuy,BGRA,jpeg? ? 420f,420v,BGRA,jpeg? ? ? ? 420f, 420v, BGRA, jpeg
12? 靜態(tài)圖像捕捉
AVCaptureStillImageOutput*stillImageOutput = [[AVCaptureStillImageOutputalloc] init];NSDictionary*outputSettings = [[NSDictionaryalloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil]; [stillImageOutput setOutputSettings:outputSettings];
13 填充模式
支持使用videoGravity 設(shè)置三種模式:
● AVLayerVideoGravityResizeAspect:保留長寬比辉词,未填充部分會有黑邊
● AVLayerVideoGravityResizeAspectFill:保留長寬比必孤,填充所有的區(qū)域
● AVLayerVideoGravityResize:拉伸填滿所有的空間
設(shè)備之間切換:
- (AVCaptureDevice*)cameraWithPosition:(AVCaptureDevicePosition)position {NSArray*devices = [AVCaptureDevicedevicesWithMediaType:AVMediaTypeVideo];for(AVCaptureDevice*deviceindevices ) {if( device.position== position )returndevice;returnnil; } - (void)swapFrontAndBackCameras {// 確保session已經(jīng)在使用了NSArray*inputs =self.session.inputs;for(AVCaptureDeviceInput*inputininputs ) {AVCaptureDevice*device = input.device;if( [device hasMediaType:AVMediaTypeVideo] ) {AVCaptureDevicePositionposition = device.position;AVCaptureDevice*newCamera =nil;AVCaptureDeviceInput*newInput =nil;if(position ==AVCaptureDevicePositionFront) {newCamera = [selfcameraWithPosition:AVCaptureDevicePositionBack]; }else{newCamera = [selfcameraWithPosition:AVCaptureDevicePositionFront]; }? ? ? ? newInput = [AVCaptureDeviceInputdeviceInputWithDevice:newCamera error:nil];// beginConfiguration 確保更改未被立即使用[self.sessionbeginConfiguration];? ? ? ? [self.sessionremoveInput:input];? ? ? ? [self.sessionaddInput:newInput];// 更改立即實現(xiàn)[self.sessioncommitConfiguration];break;? ? } }? }
AVFoundation的使用
初步了解了AVFoundation框架,那么我們一般用來做什么呢瑞躺?
一個方向是可以用它來掃描二維碼敷搪。參考文檔:使用系統(tǒng)原生代碼處理QRCode,想要看懂參考中的代碼幢哨,不得不了解些AVFoundation的使用啊赡勘。
1.session
AVFoundation是基于session(會話)概念的。 一個session用于控制數(shù)據(jù)從input設(shè)備到output設(shè)備的流向捞镰。
聲明一個session:
AVCaptureSession*session = [[AVCaptureSessionalloc] init];
session允許定義音頻視頻錄制的質(zhì)量闸与。
[session setSessionPreset:AVCaptureSessionPresetLow];
2.capture device
定義好session后,就該定義session所使用的設(shè)備了岸售。(使用AVMediaTypeVideo 來支持視頻和圖片)
AVCaptureDevice*captureDevice = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];
3.capture device input
有了capture device, 然后就獲取其input capture device践樱, 并將該input device加到session上。
AVCaptureDeviceInput*deviceInput = [AVCaptureDeviceInputdeviceInputWithDevice:captureDevice error:&error];if( [session canAddInput:deviceInput] )[session addInput:deviceInput];
4.preview
在定義output device之前凸丸,我們可以先使用preview layer來顯示一下camera buffer中的內(nèi)容拷邢。這也將是相機的“取景器”。
AVCaptureVideoPreviewLayer可以用來快速呈現(xiàn)相機(攝像頭)所收集到的原始數(shù)據(jù)屎慢。
我們使用第一步中定義的session來創(chuàng)建preview layer, 并將其添加到main view layer上瞭稼。
AVCaptureVideoPreviewLayer*previewLayer = [[AVCaptureVideoPreviewLayeralloc] initWithSession:session]; [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];CALayer*rootLayer = [[selfview] layer];[rootLayer setMasksToBounds:YES];[previewLayer setFrame:CGRectMake(-70,0, rootLayer.bounds.size.height, rootLayer.bounds.size.height)];[rootLayer insertSublayer:previewLayer atIndex:0];
5.start Run
最后需要start the session.
[session startRunning];