AVFoundation

關(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];

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

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

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