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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腻惠,隨后出現(xiàn)的幾起案子环肘,更是在濱河造成了極大的恐慌,老刑警劉巖集灌,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悔雹,死亡現(xiàn)場離奇詭異,居然都是意外死亡绝页,警方通過查閱死者的電腦和手機荠商,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來续誉,“玉大人莱没,你說我怎么就攤上這事】嵫唬” “怎么了饰躲?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵牙咏,是天一觀的道長。 經(jīng)常有香客問我嘹裂,道長妄壶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任寄狼,我火速辦了婚禮丁寄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泊愧。我一直安慰自己伊磺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布删咱。 她就那樣靜靜地躺著屑埋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痰滋。 梳的紋絲不亂的頭發(fā)上摘能,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音敲街,去河邊找鬼团搞。 笑死,一個胖子當(dāng)著我的面吹牛聪富,可吹牛的內(nèi)容都是我干的莺丑。 我是一名探鬼主播著蟹,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼墩蔓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了萧豆?” 一聲冷哼從身側(cè)響起奸披,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涮雷,沒想到半個月后阵面,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡洪鸭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年样刷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片览爵。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡置鼻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜓竹,到底是詐尸還是另有隱情箕母,我是刑警寧澤储藐,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站嘶是,受9級特大地震影響钙勃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聂喇,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一辖源、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧希太,春花似錦同木、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芥映,卻和暖如春洲尊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奈偏。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工坞嘀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惊来。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓丽涩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親裁蚁。 傳聞我的和親對象是個殘疾皇子矢渊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容