版本記錄
版本號 | 時間 |
---|---|
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)敛苇。
下圖展示的是AVFoundation
在OS X中的結(jié)構(gòu)或位置。
你應(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)的類提供了處理音頻的很好的方式笤闯。
- 處理音頻文件堕阔,請使用AVAudioPlayer
- 錄制視頻,請使用AVAudioRecorder
你可以使用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ì)列。
先決條件
AVFoundation
是Cocoa Framework
里比較高級的框架了牵祟,為了有效的使用深夯,你必須做到如下幾點(diǎn):
- 對基礎(chǔ)Cocoa開發(fā)工具和技術(shù)的牢固的了解。
- 對
block
的基本理解 - 對KVC和KVO的基本理解
- 對于播放诺苹,要對
Core Animation
和AVKit
框架有基本的了解咕晋。
后記
未完,待續(xù)~~~~