AVFoundation框架解析(三)—— 幾個關(guān)鍵問題之關(guān)于框架的深度概括

版本記錄

版本號 時間
V1.0 2017.08.29

前言

AVFoundation框架是ios中很重要的框架,所有與視頻音頻相關(guān)的軟硬件控制都在這個框架里面挽放,接下來這幾篇就主要對這個框架進(jìn)行介紹和講解。感興趣的可以看我上幾篇。
1. AVFoundation框架解析(一)—— 基本概覽
2. AVFoundation框架解析(二)—— 實(shí)現(xiàn)視頻預(yù)覽錄制保存到相冊

關(guān)于AVFoundation

AVFoundation是您可以用來播放和創(chuàng)建基于時間的視聽媒體的幾個框架之一樊诺,它提供了一個Objective-C接口扶欣,你可以使用這個接口用于基于時間的視聽數(shù)據(jù)的詳細(xì)級別鹅巍。 例如,您可以使用它來檢查料祠,創(chuàng)建骆捧,編輯或重新編碼媒體文件。你還可以在實(shí)時捕獲和播放期間從設(shè)備獲取輸入流并操縱視頻髓绽。 下圖顯示了其在iOS上的體系結(jié)構(gòu)敛苇。

框架在ios體系內(nèi)的位置

下圖展示的是AVFoundation在OS X中的結(jié)構(gòu)或位置。

框架在OS X中的位置

你應(yīng)該通常使用可用的最高級別抽象顺呕,使您可以執(zhí)行所需的任務(wù):

  • 如果您只想播放電影枫攀,請使用AVKit框架
  • 在iOS上,當(dāng)您只需要最少的格式控制時錄制視頻塘匣,請使用UIKit框架(UIImagePickerController)脓豪。

但請注意,您在AV Foundation中使用的一些原始數(shù)據(jù)結(jié)構(gòu)(包括與時間相關(guān)的數(shù)據(jù)結(jié)構(gòu)和不透明對象攜帶和描述媒體數(shù)據(jù))在Core Media框架中聲明忌卤。


進(jìn)一步剖析AV Foundation

AV Foundation框架包括兩個部分扫夜,一部分是與視頻有關(guān)的API,另外一個部分是只與音頻有關(guān)的API,舊的與音頻相關(guān)的類提供了處理音頻的很好的方式笤闯。

你可以使用AVAudioSession配置你程序中的音頻行為颗味。

1. 使用AVFoundation展示和使用媒體

AVFoundation框架中用來展示媒體的主要類是AVAsset超陆,框架的設(shè)計在很大程度上取決于這一表示。理解它的結(jié)構(gòu)會幫你理解框架的工作方式浦马,一個AVAsset對象是一個或多個媒體數(shù)據(jù)(音頻和視頻軌道)的集合的聚合表示时呀。 它提供關(guān)于整個集合的信息,例如其標(biāo)題晶默,持續(xù)時間谨娜,自然呈現(xiàn)大小等。AVAsset不受特定數(shù)據(jù)格式的限制磺陡。它是其他類的超類趴梢,用于從URL中的媒體創(chuàng)建資產(chǎn)實(shí)例并創(chuàng)建新組合。

資產(chǎn)中的每個媒體數(shù)據(jù)片段都是統(tǒng)一的類型币他,稱為軌道坞靶。在典型的簡單情況下,一個軌道表示音頻分量蝴悉,另一個表示視頻分量彰阴; 然而,在復(fù)雜的組合中辫封,音頻和視頻可能存在多個重疊的軌道硝枉。資產(chǎn)也可能有元數(shù)據(jù)。

AVFoundation框架中一個重要的概念就是倦微,初始化一個asset或者軌道對象妻味,并不一定意味著它可以使用。甚至可能需要一些時間來計算項(xiàng)目的持續(xù)時間(例如欣福,MP3文件责球,可能不包含摘要信息)。而不是在計算值時阻止當(dāng)前線程拓劝,您可以通過使用塊定義的回調(diào)異步獲取值并獲取答案雏逾。

2. 回放

AVFoundation允許您以復(fù)雜的方式管理資產(chǎn)的回放。 為了支持這一點(diǎn)郑临,它將資產(chǎn)的呈現(xiàn)狀態(tài)與資產(chǎn)本身分開栖博。這就允許你,例如厢洞,同時以不同的分辨率仇让,播放同一個資源的不同部分典奉。資產(chǎn)的呈現(xiàn)狀態(tài)由播放器項(xiàng)目對象管理, 資源內(nèi)的每個軌道的呈現(xiàn)狀態(tài)由播放器項(xiàng)目軌道對象管理丧叽。使用播放器對象項(xiàng)目和播放器項(xiàng)目軌道卫玖,你可以,例如踊淳,設(shè)置播放器呈現(xiàn)項(xiàng)目的可視部分的大小假瞬,設(shè)置要在播放過程中應(yīng)用的音頻混合參數(shù)和視頻合成設(shè)置,或在播放過程中禁用該資源的組件迂尝。

您可以使用播放器對象播放播放器內(nèi)容項(xiàng)目脱茉,并將播放器的輸出定向到Core Animation層。您可以使用播放器隊(duì)列按順序調(diào)度播放器項(xiàng)目集合內(nèi)容的播放雹舀。

3. 資源的讀芦劣、寫和重編碼

AVFoundation允許您以多種方式創(chuàng)建資源的新的表示,你可以簡單的對資源進(jìn)行重編碼说榆,或者在iOS 4.1 及以后,你可以對資源的內(nèi)容執(zhí)行操作寸认,并將結(jié)果另存為新資源签财。

你可以使用導(dǎo)出會話將現(xiàn)有存在的資源重新編碼為由少數(shù)常用預(yù)設(shè)之一定義的格式。如果您需要對轉(zhuǎn)換的更多控制偏塞,則在iOS 4.1及更高版本中唱蒸,您可以一起使用資源讀取器和資源編寫器對象將資源從一個表示轉(zhuǎn)換為另一個表示。

使用這些對象灸叼,例如神汹,您可以選擇要在輸出文件中表示的軌道,指定您自己的輸出格式古今,或在轉(zhuǎn)換過程中修改資源屁魏。

要產(chǎn)生波形的視覺展示,您可以使用資源讀取器來讀取資產(chǎn)的音軌捉腥。

4. 縮略圖

要創(chuàng)建視頻演示文稿的縮略圖氓拼,您可以使用要從中生成縮略圖的資產(chǎn)初始化AVAssetImageGenerator的實(shí)例。AVAssetImageGenerator使用默認(rèn)啟用的視頻軌道生成圖像抵碟。

5. 編輯

AVFoundation使用組合從現(xiàn)有的媒體片段(通常是一個或多個視頻和音軌)創(chuàng)建新的資源桃漾。您還可以設(shè)置音軌的相對音量和斜坡,并設(shè)置視頻軌道的不透明度和不透明度斜坡拟逮。一個組合是在記憶體中保存的一組媒體撬统。 使用導(dǎo)出會話導(dǎo)出作品時,它會折疊到一個文件敦迄。

您還可以使用資源編寫器從媒體介質(zhì)(如樣本緩沖區(qū)或靜態(tài)圖像)創(chuàng)建資源恋追。

6. 靜態(tài)和視頻媒體采集

從攝像機(jī)和麥克風(fēng)錄制輸入由拍攝會話管理凭迹。 采集會話協(xié)調(diào)從輸入設(shè)備到諸如電影文件之類的輸出的數(shù)據(jù)流。即使會話正在運(yùn)行几于,也可以為單個會話配置多個輸入和輸出蕊苗。 您發(fā)送消息到會話以啟動和停止數(shù)據(jù)流。

此外沿彭,您可以使用預(yù)覽圖層的實(shí)例向用戶顯示相機(jī)正在錄制的內(nèi)容朽砰。

7. AVFoundation并發(fā)編程

來自AVFoundation調(diào)用塊,鍵值觀察器和通知處理程序的回調(diào)不能保證在任何特定的線程或隊(duì)列上進(jìn)行喉刘,相反瞧柔,AVFoundation會在執(zhí)行其內(nèi)部任務(wù)的線程或隊(duì)列上調(diào)用這些處理程序。

就通知和線程而言睦裳,有兩個基本準(zhǔn)則:

  • 與UI相關(guān)的通知在主線程發(fā)生
  • 要求您創(chuàng)建和/或指定隊(duì)列的類或方法將返回該隊(duì)列上的通知造锅。

除了這兩個基本準(zhǔn)則,您不應(yīng)該假設(shè)在任何特定的線程上返回通知廉邑。

如果您正在編寫多線程應(yīng)用程序哥蔚,則可以使用NSThread方法isMainThread[[NSThread currentThread] isEqual:<#A stored thread reference#>]來測試調(diào)用線程是否是您希望執(zhí)行工作的線程。您可以使用以下方法將消息重定向到相應(yīng)的線程:performSelectorOnMainThread:withObject:waitUntilDone:performSelector:onThread:withObject:waitUntilDone:modes:蛛蒙。

您也可以使用dispatch_async在適當(dāng)?shù)年?duì)列上“彈回”到您的塊糙箍,用于UI任務(wù)的主要隊(duì)列或用于并發(fā)操作的隊(duì)列。


先決條件

AVFoundationCocoa Framework里比較高級的框架了牵祟,為了有效的使用深夯,你必須做到如下幾點(diǎn):

  • 對基礎(chǔ)Cocoa開發(fā)工具和技術(shù)的牢固的了解。
  • block的基本理解
  • 對KVC和KVO的基本理解
  • 對于播放诺苹,要對Core AnimationAVKit框架有基本的了解咕晋。

后記

未完,待續(xù)~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末收奔,一起剝皮案震驚了整個濱河市掌呜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筹淫,老刑警劉巖站辉,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異损姜,居然都是意外死亡饰剥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門摧阅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汰蓉,“玉大人,你說我怎么就攤上這事棒卷」四酰” “怎么了祝钢?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長若厚。 經(jīng)常有香客問我拦英,道長,這世上最難降的妖魔是什么测秸? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任疤估,我火速辦了婚禮,結(jié)果婚禮上霎冯,老公的妹妹穿的比我還像新娘铃拇。我一直安慰自己,他們只是感情好沈撞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布慷荔。 她就那樣靜靜地躺著,像睡著了一般缠俺。 火紅的嫁衣襯著肌膚如雪显晶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天壹士,我揣著相機(jī)與錄音吧碾,去河邊找鬼。 笑死墓卦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的户敬。 我是一名探鬼主播落剪,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尿庐!你這毒婦竟也來了忠怖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤抄瑟,失蹤者是張志新(化名)和其女友劉穎凡泣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皮假,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞋拟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惹资。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贺纲。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褪测,靈堂內(nèi)的尸體忽然破棺而出猴誊,到底是詐尸還是另有隱情潦刃,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布懈叹,位于F島的核電站乖杠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澄成。R本人自食惡果不足惜胧洒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望环揽。 院中可真熱鬧略荡,春花似錦、人聲如沸歉胶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽通今。三九已至粥谬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辫塌,已是汗流浹背漏策。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臼氨,地道東北人掺喻。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像储矩,于是被迫代替她去往敵國和親感耙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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