關(guān)于AVFoundation
AVFoundation是可用于播放和創(chuàng)建基于時(shí)間的音視頻媒體的幾個(gè)框架之一。它提供了一個(gè)Objective-C接口,您可以使用它來(lái)詳細(xì)處理基于時(shí)間的音視頻數(shù)據(jù)。例如,您可以使用它來(lái)檢查,創(chuàng)建,編輯或重新編碼媒體文件。您還可以從設(shè)備獲取輸入流,并在實(shí)時(shí)捕獲和回放期間處理視頻。圖I-1顯示了iOS上的體系結(jié)構(gòu)。

圖I-2顯示了OS X上相應(yīng)的媒體體系結(jié)構(gòu)。

通常,您應(yīng)該使用可用的最高級(jí)別抽象,來(lái)處理你的任務(wù)。
如果您只想播放電影,請(qǐng)使用AVKit框架。
在iOS上,要在只需要對(duì)格式進(jìn)行最小控制的情況下錄制視頻,請(qǐng)使用UIKit框架(UIImagePickerController)。
但是請(qǐng)注意,您在AV Foundation中使用的某些原始數(shù)據(jù)結(jié)構(gòu)(包括與時(shí)間相關(guān)的數(shù)據(jù)結(jié)構(gòu)以及用于承載和描述媒體數(shù)據(jù)的不透明對(duì)象)是在Core Media框架中聲明的。
通過(guò)AVFoundation表示和使用媒體
AV Foundation框架用來(lái)表示媒體的主要類是AVAsset。框架的設(shè)計(jì)在很大程度上受這種表現(xiàn)形式的指導(dǎo)。了解其結(jié)構(gòu)將幫助您了解框架的工作原理。一個(gè)AVAsset實(shí)例是媒體數(shù)據(jù)的一個(gè)或多個(gè)片(音頻和視頻軌道)的集合的聚集表示。它提供有關(guān)集合整體的信息,例如其標(biāo)題,持續(xù)時(shí)間,自然呈現(xiàn)的大小等。AVAsset與特定的數(shù)據(jù)格式無(wú)關(guān)。AVAsset是用于從URL上的媒體創(chuàng)建資產(chǎn)實(shí)例(請(qǐng)參閱Using Assets)和創(chuàng)建新合成(請(qǐng)參見(jiàn)Editing)的其他類的超類。
asset中的每個(gè)媒體數(shù)據(jù)都屬于統(tǒng)一類型,稱為track。在簡(jiǎn)單情況下,一個(gè)track代表音頻分量,另一track代表視頻分量。但是,在復(fù)雜的組成中,可能會(huì)有多個(gè)重疊的音頻和視頻track。asset也可能具有元數(shù)據(jù)。
AV Foundation中的一個(gè)重要概念是,正在初始化的asset或track不一定意味著它可以被直接使用。甚至可能需要一段時(shí)間來(lái)計(jì)算項(xiàng)目的持續(xù)時(shí)間(例如,MP3文件可能不包含摘要信息)。您可以在請(qǐng)求值的同時(shí),通過(guò)使用block定義的回調(diào)異步返回答案,而不是在計(jì)算值時(shí)阻塞當(dāng)前線程。
相關(guān)章節(jié): 使用asset,時(shí)間和媒體表示形式
播放
AVFoundation允許您以精細(xì)的方式管理資產(chǎn)的回放。為此,它將asset的呈現(xiàn)狀態(tài)與asset本身分開。例如,這使您可以同時(shí)播放以不同分辨率渲染的同一asset的兩個(gè)不同片段。asset的呈現(xiàn)狀態(tài)由a player item object管理;asset中每個(gè)track的呈現(xiàn)狀態(tài)由player item track對(duì)象管理。例如,使用player item and player item tracks,您可以設(shè)置播放器呈現(xiàn)項(xiàng)目的視覺(jué)部分的大小,設(shè)置要在播放期間應(yīng)用的音頻混合參數(shù)和視頻構(gòu)圖設(shè)置,或者禁用播放期間的asset。
您可以使用a player對(duì)象播放player items,并將player 的輸出定向到 Core Animation laye。您可以使用player queue 按順序安排播放器項(xiàng)目集合的播放。
相關(guān)章節(jié): 播放
讀取,寫入和重新編碼資產(chǎn)
AVFoundation允許您以多種方式創(chuàng)建asset的新表示形式。您可以簡(jiǎn)單地對(duì)現(xiàn)有asset進(jìn)行重新編碼,或者-在iOS 4.1和更高版本中-您可以對(duì)資產(chǎn)的內(nèi)容執(zhí)行操作,并將結(jié)果另存為新asset。
您可以使用export session將現(xiàn)有asset重新編碼為由少量常用presets之一定義的格式。如果需要對(duì)轉(zhuǎn)換進(jìn)行更多控制,則在iOS 4.1及更高版本中,可以串聯(lián)使用asset reader 和 asset writer對(duì)象,以將asset從一種表示形式轉(zhuǎn)換為另一種表示形式。例如,使用這些對(duì)象,您可以選擇要在輸出文件中表示的track,指定自己的輸出格式或在轉(zhuǎn)換過(guò)程中修改asset。
要生成波形的直觀表示,請(qǐng)使用asset reader來(lái)讀取asset的audio track。
Relevant Chapter: Using Assets
縮圖
要?jiǎng)?chuàng)建video的縮略圖,您需要用asset初始化一個(gè)AVAssetImageGenerator實(shí)例,然后生成縮略圖。AVAssetImageGenerator使用默認(rèn)啟用的視頻軌道生成圖像。
相關(guān)章節(jié): 使用資產(chǎn)
編輯
AVFoundation使用compositions來(lái)從現(xiàn)有媒體(通常是一個(gè)或多個(gè)視頻和音頻軌道)創(chuàng)建新asset。您可以使用mutable的compositions來(lái)添加和刪除track,以及調(diào)整它們的時(shí)間順序。您還可以設(shè)置音頻track的音量和傾斜度。并設(shè)置視頻track的不透明度和不透明度漸變。composition是保存在內(nèi)存中的媒體片段的組合。使用export session,導(dǎo)出composition時(shí),它會(huì)寫入到文件中。
您還可以使用asset writer從媒體(例如樣本緩沖區(qū)或圖片)創(chuàng)建asset。
相關(guān)章節(jié): 編輯
靜止和視頻媒體捕獲
攝像機(jī)和麥克風(fēng)的錄制輸入由capture session管理。capture session把從輸入設(shè)備的數(shù)據(jù)流轉(zhuǎn)化到輸出(例如電影文件)中。即使會(huì)話正在運(yùn)行,也可以為單個(gè)會(huì)話配置多個(gè)輸入和輸出。您將消息發(fā)送到seesion以啟動(dòng)和停止數(shù)據(jù)流。
此外,您可以使用preview layer的實(shí)例向用戶顯示攝像機(jī)正在錄制的內(nèi)容。
相關(guān)章節(jié): 靜止和視頻媒體捕獲
與AVFoundation并發(fā)編程
不能保證從AVFoundation進(jìn)行的回調(diào)(blocks,KVO和notification)在任何特定線程或隊(duì)列上進(jìn)行。而是,AVFoundation在執(zhí)行其內(nèi)部任務(wù)的線程或隊(duì)列上調(diào)用這些處理。
關(guān)于通知和線程,有兩個(gè)通用準(zhǔn)則:
與UI相關(guān)的通知在主線程上發(fā)生。
需要您創(chuàng)建和/或指定隊(duì)列的類或方法將在該隊(duì)列上返回通知。
除了這兩個(gè)準(zhǔn)則(還有一些例外,在參考文檔中已有說(shuō)明),您不應(yīng)假定會(huì)在任何特定線程上返回通知。
如果要編寫多線程應(yīng)用程序,則可以使用NSThread方法isMainThread或[[NSThread currentThread] isEqual:<#A stored thread reference#>]測(cè)試調(diào)用線程是否是希望在其上執(zhí)行工作的線程。您可以使用方法重定向報(bào)文到相應(yīng)的線程,例如performSelectorOnMainThread:withObject:waitUntilDone:和performSelector:onThread:withObject:waitUntilDone:modes:。您還可以使用dispatch_async`“反彈”到適當(dāng)隊(duì)列上的塊,這些隊(duì)列可以是UI任務(wù)的主隊(duì)列,也可以是用于并發(fā)操作的隊(duì)列。有關(guān)并發(fā)操作的更多信息,請(qǐng)參見(jiàn)《并發(fā)編程指南》。有關(guān)塊的更多信息,請(qǐng)參見(jiàn)塊編程主題。該AVCam-IOS:使用AVFoundation捕獲圖像和電影 示例代碼被視為所有AVFoundation功能的主要示例,有關(guān)AVFoundation的線程和隊(duì)列使用示例,可??以參考該示例代碼。