本文是本人自己辛苦翻譯的,請(qǐng)轉(zhuǎn)載的朋友注明,翻譯于Z.MJun的簡(jiǎn)書 ,感謝!<翻譯不容易啊>
翻譯于2016年9月6日
About AVFoundation
Important:這個(gè)文檔包含關(guān)于API和開發(fā)技術(shù)的初級(jí)信息。這個(gè)信息受變化和軟件支配。軟件通過這個(gè)文檔,最終會(huì)在操作系統(tǒng)上被測(cè)試。
AVFoundation 是其中一個(gè)你可以是用來播放和創(chuàng)建基于時(shí)間的視聽媒體。這里提供OBJ-C接口,你可以使用他來管理一個(gè)詳細(xì)等級(jí)的基于時(shí)間的視聽媒體數(shù)據(jù)。例如,你可以使用它來檢查,創(chuàng)建,編輯,和寫入媒體文件。你可以從設(shè)備上獲取輸入流,和操作視頻實(shí)時(shí)捕獲,播放等。
圖I-1,AVFoundation stack on iOS

圖I-2,AVFoundation stack on OS X

你應(yīng)該通常使用最高級(jí)的可用的抽象方法來允許你的執(zhí)行你想要執(zhí)行的任務(wù)。
- 如果你只是想簡(jiǎn)單播放電影,可以使用AVKit framework.
- 在IOS上,當(dāng)記錄視頻時(shí),如果你需要對(duì)格式最小控制,使用UIKit framework。
切記,在你使用AV Foundation上的一些原始數(shù)據(jù)結(jié)構(gòu),包含最近時(shí)間數(shù)據(jù)結(jié)構(gòu)和不透明的對(duì)象來攜帶和描述媒體數(shù)據(jù),在Core Media framework中有聲明。
At a Glance
關(guān)于 AVFoundation framework有兩個(gè)方面。一個(gè)是視頻的APIs,一個(gè)是音頻的APIs。舊的音頻相關(guān)對(duì)象提供了簡(jiǎn)單的方法來處理音頻。這個(gè)描述在Multimedia Programming Guide,這文檔不做描述。
- 播放音頻文件,可以使用AVAudioPlayer。
- 錄制音頻文件,你可以使用 AVAudioRecorder。
你可以使用AVAudioSession這個(gè)來配置應(yīng)用中的音頻屬性。詳情可以看 Audio Session Programming Guide。
Representing and Using Media with AVFoundation
AV Foundation framework使用基礎(chǔ)類AVAsset來代表媒體。對(duì)于這個(gè),有大量的引導(dǎo)支持。了解這個(gè)數(shù)據(jù)結(jié)構(gòu)有助于了解這個(gè)庫是怎么工作的。AVAsset實(shí)例化匯總了一個(gè)或者多個(gè)媒體數(shù)據(jù)(音頻和視頻的軌道)。他提供了所有信息,如標(biāo)題,時(shí)長(zhǎng),內(nèi)存大小和其他。AVAsset不綁定數(shù)據(jù)類型。AVAsset是其他類的父類,用于通過一個(gè)URL創(chuàng)建媒體和創(chuàng)建新的AVAsset組件。
每一個(gè)在AVAsset的單獨(dú)的媒體數(shù)據(jù),都是一定格式和相應(yīng)一個(gè)軌道。在常用的方法力,一個(gè)軌道代表音頻組件和其他代表視頻組件。在一個(gè)混合組件中,音頻和視頻可能包含多個(gè)重疊的軌道。AVAsset也有元數(shù)據(jù)。
在AV Foundation中的一個(gè)重要概念是,初始化一個(gè)AVAsset或者軌道并不意味它是現(xiàn)成的,他可能需要一些時(shí)間來計(jì)算持續(xù)時(shí)間(一個(gè)MP3文件,例如,沒有包含整體信息)。而不是在阻塞當(dāng)前線程,來計(jì)算一個(gè)值。你需要定義一個(gè)異步的block來獲取這個(gè)值。
關(guān)鍵字Using Assets,Time and Media Representations
回放
AVFoundation允許你通過復(fù)雜方法來管理回放。對(duì)于這個(gè),它從AVAsset上分離了AVAsset的表現(xiàn)狀態(tài)。這允許你,例如,播放兩個(gè)不同片段,使用同樣的AVAsset,同事呈現(xiàn)在不用的分辨率下。這個(gè)呈現(xiàn)狀態(tài)是被player item對(duì)象管理著。呈現(xiàn)對(duì)象的每個(gè)軌道是由player item track對(duì)象管理。使用播放器和播放器軌道,例如,設(shè)置播放器大小,設(shè)置播放過程中播放器的混合參數(shù),視頻的組合部分,和禁止播放中部分組件使用。
你可以使用player對(duì)象播放播放器,和直接的把播放器的輸出到核心動(dòng)畫Core Animation層。你還可以使用player queue播放隊(duì)列來按順序播放內(nèi)容。
關(guān)鍵字Playback
讀取,寫入和對(duì)Assets重新編碼
在多個(gè)方面,AVFoundation允許你創(chuàng)建一個(gè)新的asset。你可以簡(jiǎn)單的重新編碼現(xiàn)有的Assets,或者在IOS4.1及以上。你可以在執(zhí)行操作Assets上的內(nèi)容,并且保存在一個(gè)新的Assets上。
你可以使用export session重新編譯一個(gè)存在的Assets到一些常用的預(yù)設(shè)置格式。如果你需要更多的控制轉(zhuǎn)格式。在IOS4.1及以上,你可以使用asset reader和asset writer對(duì)象來將Assets表現(xiàn)形式轉(zhuǎn)到另一個(gè)上。使用這些類,例如,選擇一個(gè)軌道是你想展現(xiàn)在輸出文件力,特別是你的輸出格式,或者修改轉(zhuǎn)換過程中的Assets。
要產(chǎn)生wave格式,你可以使用asset reader來讀取音頻軌道。
關(guān)鍵字Using Assets
略縮圖
生成視頻的略縮圖,你可以初始化使用AVAssetImageGenerator來獲取你想要的略縮圖。使用這個(gè)默認(rèn)可用視頻軌道來生成圖片。
關(guān)鍵字Using Assets
編輯
AVFoundation使用compositions從存在的多個(gè)媒體創(chuàng)建新的assets(通常,一個(gè)或多個(gè)視頻和音頻軌道)。你使用可變的組合來增加和減少軌道,和調(diào)整他們的時(shí)間排序。你同時(shí)可以設(shè)置相對(duì)音量和音頻軌道率。設(shè)置視頻的透明度和透明率。一個(gè)媒體組合是存放在內(nèi)存里。當(dāng)然你使用export session輸出一個(gè)組合,他講導(dǎo)入到文件里。
你還可以通過asset writer為以下創(chuàng)建assets,如臨時(shí)緩存,靜待圖片組
關(guān)鍵字Editing
靜態(tài)和視頻媒體捕獲
capture session記錄攝像頭輸入,和管理麥克風(fēng)。capture會(huì)話協(xié)調(diào)一些數(shù)據(jù)流從輸入設(shè)備到輸出設(shè)備,如電影文件。你可以配置不同的輸入和輸入到簡(jiǎn)單的會(huì)話。檔這個(gè)會(huì)話運(yùn)行,你發(fā)送信息到這個(gè)會(huì)話中來啟動(dòng)和結(jié)束數(shù)據(jù)流。
另外,你可以使用preview layer向用戶展示攝像頭的記錄。
關(guān)鍵字Still and Video Media Capture
AVFoundation并發(fā)程序設(shè)計(jì)
AVFoundation回調(diào)---調(diào)用block,kvo,notification方法---不保證在任何特定的線程或隊(duì)列上。換句話說,AVFoundation在線程上或者隊(duì)列上調(diào)用這些處理程序,來執(zhí)行內(nèi)部任務(wù)。
一般有兩個(gè)準(zhǔn)則,如notifications和線程ing
- 在主線程上處理用戶界面相關(guān)通知。
- 需要?jiǎng)?chuàng)建或指定一個(gè)隊(duì)列的類或方法將返回該隊(duì)列的通知。
在這個(gè)兩個(gè)準(zhǔn)則之上(也有例外,在當(dāng)前的參考文檔中)你不應(yīng)該假設(shè)通知在任何特定的線程上返回。
如果你寫一個(gè)多線程應(yīng)用,你可以使用NSThread方法。
isMainThread or [[NSThread currentThread] isEqual:<#A stored thread reference#>]
來檢測(cè)調(diào)用的線程是你期望的一個(gè)線程來執(zhí)行你的工作。你可以重定向到合適的線程下。如使用這個(gè)方法performSelectorOnMainThread:withObject:waitUntilDone:和performSelector:onThread:withObject:waitUntilDone:modes:。同樣,你可以在合適的隊(duì)列上使用使用dispatch_async來“反彈”你的block,無論是用于用戶界面任務(wù)的主隊(duì)列還是一個(gè)用于并發(fā)操作的隊(duì)列。關(guān)于更多的并發(fā)操作,請(qǐng)看Concurrency Programming Guide。關(guān)于block的,請(qǐng)看Blocks Programming Topics。AVCam-iOS: Using AVFoundation to Capture Images and Movies簡(jiǎn)單代碼來介紹基礎(chǔ)例子,所有的AVFoundation功能和可為線程和隊(duì)列使用AVFoundation實(shí)例參考。
Prerequisites
AVFoundation是Cocoa framework里一個(gè)前沿的框架。使用前,你需要了解一下內(nèi)容:
- 扎實(shí)的了解基本的Cocoa開發(fā)工具和技術(shù)
- block基礎(chǔ)知識(shí)
- kvc和kvo的基礎(chǔ)知識(shí)
- 回放,對(duì)核心動(dòng)畫的基本理解Core Animation Programming Guide,回放基礎(chǔ)了解,AVKit Framework Reference.
更多
這里有一些AVFoundation列子,包括兩個(gè),一個(gè)是關(guān)鍵理解和實(shí)現(xiàn)攝像頭捕獲方法。
- AVCam-iOS: Using AVFoundation to Capture Images and Movies規(guī)范的代碼來實(shí)現(xiàn)使用攝像頭功能。是一個(gè)完整的事例,很好的文檔書寫和涵蓋了大部分功能的最佳實(shí)踐。
- AVCamManual: Extending AVCam to Use Manual Capture API是同伴的應(yīng)用程序avcam。它實(shí)現(xiàn)了相機(jī)功能,使用手動(dòng)相機(jī)控制。它也是一個(gè)完整的例子,以及記錄,應(yīng)該被視為典型的例子,創(chuàng)建相機(jī)應(yīng)用程序,利用手動(dòng)控制。
- RosyWriter是一個(gè)演示實(shí)時(shí)幀處理的示例,特別是如何將篩選器應(yīng)用到視頻內(nèi)容中。這是一個(gè)非常常見的開發(fā)人員的要求,這個(gè)例子涵蓋了功能。
- AVLocationPlayer: Using AVFoundation Metadata Reading APIs演示使用元數(shù)據(jù)的接口。