寫在前面
喜歡AVFoundation資料的同學可以關注我的專題:《AVFoundation》專輯
也可以關注我的簡書賬號
正文
AVFoundation
是iOS
開發(fā)者可以用來播放和創(chuàng)建基于時間的視聽媒體的幾個框架之一应民。它提供了一個Objective-C
接口(當然剪个,Swift
也可以使用)袜香,用于在基于時間的視聽數(shù)據(jù)的詳細級別上工作。例如惧浴,你可以使用它來檢查瑟蜈,創(chuàng)建塞俱,編輯或重新編碼媒體文件姐帚。你還可以在實時捕獲和回放期間從設備獲取輸入流并操縱視頻。圖I-1
顯示了iOS
上的體系結構障涯。
圖
I-2
顯示了OS X
上相應的媒體體系結構不過罐旗,咱們一般都是只會使用最上層的接口。
- 如果你只想播放視頻唯蝶,使用
AVKit
框架就足夠了九秀。 - 在
iOS
上,如果只是簡單地錄制視頻并且對格式?jīng)]有什么要求的話粘我,請使用UIKit
框架中的UIImagePickerController
鼓蜒。
請注意,你在
AVFoundation
中使用的一些原始數(shù)據(jù)結構(包括與時間相關的數(shù)據(jù)結構和opaque
對象來承載和描述媒體數(shù)據(jù))在Core Media
框架中聲明征字。
簡述
AVFoundation
框架有兩個方面 - 與視頻相關的API
和僅與音頻相關的API
都弹。較舊的音頻相關類提供了處理音頻的簡便方法。
- 要播放聲音文件匙姜,你可以使用
AVAudioPlayer
畅厢。 - 要錄制音頻,你可以使用
AVAudioRecorder
氮昧。
你還可以使用AVAudioSession
配置應用程序的音頻行為;Audio Session Programming Guide中對此進行了描述框杜。
關于
AVAudioPlayer
,AVAudioRecorder
以及Audio Session Programming Guide袖肥,我會在后面提供詳細的資料咪辱。
使用AVFoundation表示和使用媒體
AVFoundation
框架用于表示媒體的主要類是AVAsset≌焉欤框架的設計在很大程度上受到這種表示的指導梧乘。了解其結構將有助于你了解框架的工作原理。 AVAsset
實例是一個或多個媒體數(shù)據(jù)(音頻和視頻軌道)的集合的聚合表示庐杨。它提供有關整個集合的信息选调,例如標題,持續(xù)時間灵份,自然表示大小等仁堪。 AVAsset
與特定數(shù)據(jù)格式無關。 AVAsset
是用于從URL
處的媒體創(chuàng)建資產(chǎn)實例的其他類的超類(請參閱AVFoundation編程指南03-Assets使用)和創(chuàng)建新的合成(請參閱AVFoundation編程指南05-編輯)填渠。
Asset
中的每個媒體數(shù)據(jù)都是統(tǒng)一類型并稱為track
(軌道)弦聂。在典型的簡單情況下,一個track
代表音頻組件氛什,另一個track
代表視頻組件;然而莺葫,在復雜的構圖中,可能存在多個重疊的音頻和視頻track
(軌道)枪眉。Asset
也可能包含metadata
(元數(shù)據(jù))捺檬。
AV Foundation
的一個重要概念是:初始化asset
或track
并不一定意味著它已經(jīng)可以使用了。甚至可能需要一些時間來計算項目的持續(xù)時間(MP3
文件贸铜,例如堡纬,可能不包含摘要信息)。不是在計算值時阻塞當前線程蒿秦,而是通過使用block
定義的回調(diào)異步請求值并獲得回調(diào)烤镐。
相關章節(jié):AVFoundation編程指南03-Assets使用, AVFoundation編程指南08-時間和媒體表示
Playback
AVFoundation
允許你以復雜的方式管理Asset
的播放。為了支持這一點棍鳖,它將asset
的表示狀態(tài)與asset
本身分開炮叶。例如,這允許你在不同分辨率下同時播放同一asset
的兩個不同片段渡处。asset
的呈現(xiàn)狀態(tài)由player item
對象管理;asset
內(nèi)每個track
的呈現(xiàn)狀態(tài)由player item track
對象管理镜悉。例如,使用player item
和player item tracks
骂蓖,你可以設置播放器呈現(xiàn)item
的可視部分的大小积瞒,設置要在播放期間應用的音頻混合參數(shù)和視頻組成設置,或禁用組件播放期間的asset
登下。
相關章節(jié):AVFoundation編程指南04-Playback
讀取茫孔,寫入和重編碼Assets
AVFoundation
允許你以多種方式創(chuàng)建Asset
的新的表示方式。你只需重新編碼現(xiàn)有asset
被芳,或者在iOS 4.1
及更高版本中 - 你可以對asset
內(nèi)容執(zhí)行操作并將結果另存為新的asset
缰贝。
你可以使用export session
將現(xiàn)有asset
重新編碼為由少量常用預設之一定義的格式。如果你需要對轉(zhuǎn)換進行更多控制畔濒,那么在iOS 4.1
及更高版本中剩晴,你可以串聯(lián)asset reader
和asset writer
對象,將asset
從一種表示轉(zhuǎn)換為另一種表示。例如赞弥,使用這些對象毅整,你可以選擇要在輸出文件中表示哪些tracks
,指定自己的輸出格式绽左,或在轉(zhuǎn)換過程中修改asset
悼嫉。
要生成波形的直觀表示,請使用asset reader
讀取asset
的track
拼窥。
相關章節(jié): AVFoundation編程指南03-Assets使用
縮略圖
要創(chuàng)建視頻演示文稿的縮略圖圖像戏蔑,請使用要從中生成縮略圖的資源初始化AVAssetImageGenerator的實例。 AVAssetImageGenerator
使用默認啟用的video tracks
(視頻軌道)來生成圖像鲁纠。
相關章節(jié): AVFoundation編程指南03-Assets使用
編輯
AVFoundation
使用compositions
(組合)來從現(xiàn)有媒體(通常是一個或多個視頻和音頻tracks
)創(chuàng)建新的assets
总棵。你使用可變組合來添加和刪除tracks
,并調(diào)整其時間順序改含。你還可以設置音軌的相對volumes
和ramping
;并設置視頻軌道的opacity
和opacity ramps
情龄。合成是存儲在記憶中的媒體的集合。使用export session
導出composition
時候味,它會折疊為文件刃唤。
你還可以使用asset writer
從媒體(如樣本緩沖區(qū)或靜止圖像)創(chuàng)建asset
。
相關章節(jié):AVFoundation編程指南05-編輯
圖像和視頻媒體捕獲
來自攝像機和麥克風的錄制輸入由capture session
管理白群。Capture session
協(xié)調(diào)從輸入設備到輸出(例如電影文件)的數(shù)據(jù)流尚胞。即使會話正在運行,你也可以為單個會話配置多個輸入和輸出帜慢。你將消息發(fā)送到會話以啟動和停止數(shù)據(jù)流笼裳。
此外,你還可以使用preview layer
(預覽圖層)的實例向用戶顯示攝像頭正在錄制的內(nèi)容粱玲。
相關章節(jié):AVFoundation編程指南06-靜態(tài)圖像和視頻媒體捕獲
使用AVFoundation進行并發(fā)編程
來自AVFoundation``blocks
躬柬,KVO
和通知回調(diào)不能保證在任何特定線程或隊列上進行。相反抽减,AVFoundation
在執(zhí)行其內(nèi)部任務的線程或隊列上調(diào)用這些處理程序允青。
就通知和線程而言,有兩個一般準則:
- 與
UI
相關的通知發(fā)生在主線程上卵沉。 - 需要你創(chuàng)建和/或指定隊列的類或方法將返回該隊列上的通知颠锉。
除了這兩個指南(并且有一些例外,在參考文檔中有說明)史汗,你不應該假設將在任何特定線程上返回通知琼掠。
如果你正在編寫多線程應用程序,則可以使用NSThread
方法isMainThread或[[NSThread currentThread] isEqual:<#A stored thread reference#>]
來測試調(diào)用線程是否是您希望執(zhí)行工作的線程停撞。您可以使用諸如performSelectorOnMainThread:withObject:waitUntilDone:和performSelector:onThread:withObject:waitUntilDone:modes:等方法將消息重定向到適當?shù)木€程瓷蛙。你還可以使用dispatch_async“彈回”到適當隊列上的塊,可以是UI
任務的主隊列,也可以是并發(fā)操作的隊列艰猬。有關并發(fā)操作的更多信息横堡,請參閱Concurrency Programming Guide;有關塊的更多信息,請參閱塊Blocks Programming Topics姥宝。 AVCam-iOS: Using AVFoundation to Capture Images and Movies示例代碼被認為是所有AVFoundation
功能的主要示例翅萤,可以參考AVFoundation
的線程和隊列使用示例恐疲。
先決條件
AVFoundation
是一個先進的Cocoa
框架腊满。想要有效地使用它,你必須:
- 對基本
Cocoa
開發(fā)工具和技術的扎實理解培己。 - 對
blocks
有基本的掌握碳蛋。 - 對
KVC
和KVO
有基本的了解。 - 對于
playback
省咨,基本了解核心動畫(參見Core Animation Programming Guide肃弟,或者,對于于basic playback
零蓉,請參閱AVKit Framework Reference笤受。
參考
下面有幾個AVFoundation
示例,其中兩個是理解和實現(xiàn)Camera
捕獲功能的核心代碼:
AVCam-iOS: Using AVFoundation to Capture Images and Movies是用于實現(xiàn)使用相機功能的任何程序的規(guī)范示例代碼敌蜂。它是一個完整的Demo
箩兽,文檔齊全,涵蓋了大多數(shù)功能章喉。
AVCamManual: Extending AVCam to Use Manual Capture API是AVCam
的配套應用程序汗贫。它使用手動相機控件實現(xiàn)相機功能。它也是一個完整的Demo
秸脱,有詳細記錄落包,應該被視為創(chuàng)建利用手動控制的相機應用程序的規(guī)范示例。
RosyWriter是一個演示實時幀處理的示例摊唇,特別是如何將過濾器應用于視頻內(nèi)容咐蝇。這是一個非常常見的開發(fā)人員要求,此示例涵蓋了該功能巷查。
AVLocationPlayer: Using AVFoundation Metadata Reading APIs演示使用metadata
API
有序。
上一章 | 目錄 | 下一章 |
---|