1.1 AV Foundation的含義
AVFoundation是蘋果OSX系統(tǒng)和iOS系統(tǒng)中用于處理基于時間的媒體數(shù)據(jù)的高級Objective-C框架幸逆。高度依賴多線程機制枚碗,充分利用了多核硬件的優(yōu)勢并大量使用block和GrandCentral Dispatch(GCD)機制將復雜的計算進程放在后臺線程運行。會自動提供硬件加速操作啤斗,確保在大部分設備上應用程序能以最佳性能運行。充分考慮了電量效率來滿足諸如iPhone和iPad這類移動設備對電量控制的高要求败明。
1.2 AV Foundation的適用范圍
幾個最主要的支撐框架及其提供的功能液茎。
Core Audio
Core Audio是OS X和iOS系統(tǒng)上處理所有音頻事件的框架。Core Audio是由多個框架整合在一起的總稱乔妈,為音頻和MIDI內(nèi)容的錄制蝙云、播放和處理提供相應接口。Core Audio也提供高層級的接口路召,比如通過Audio Queue Services框架所提供的那些接口勃刨,主要處理基本的音頻播放和錄音相關功能。同時還會提供相對低層級的接口股淡,尤其是Audio Units接口身隐,它們提供了針對音頻信號進行完全控制的功能,并通過Audio Units讓你能夠構建一些復雜的音頻處理模式唯灵。Core Video
Core Video是OS X和iOS系統(tǒng)上針對數(shù)字視頻所提供的管道模式贾铝。Core Video為其相對的Core Media提供圖片緩存和緩存池支持,提供了一個能夠對數(shù)字視頻逐幀訪問的接口埠帕。該框架通過像素格式之間的轉換并管理視頻同步事項使得復雜的工作得到了有效簡化忌傻。Core Media
Core Media是AV Foundation所用到的低層級媒體管道的一部分。 它提供針對音頻樣本和視頻幀處理所需的低層級數(shù)據(jù)類型和接口搞监。Core Media還提供了AV Foundation用到的基于CMTime數(shù)據(jù)類型的時基模型水孩。CMTime及其相關數(shù)據(jù)類型一般在AV Foundation處理基于時間的操作時使用。-
Core Animation
合成及動畫相關框架琐驴。主要功能就是提供蘋果平臺所具有的美觀俘种、流暢的動畫效果秤标。提供了一個簡單、聲明性的編程模式宙刘,并已經(jīng)封裝了支持OpenGL和OpenGL ES功能的基于Objective-C的各種類苍姜。使用Core Animation時,對于視頻內(nèi)容的播放和視頻捕獲這兩個動作悬包,AV Foundation提供了硬件加速機制來對整個流程進行優(yōu)化衙猪。AV Foundation還可以利用Core Animation讓開發(fā)者能夠在視頻編輯和播放過程中添加動畫標題和圖片效果。AVFoundation處于高層級框架和低層級框架之間布近。提供了很多低層級框架才能實現(xiàn)的功能和性能垫释,以更簡單的Objective-C接口方式實現(xiàn)的。也可以和高層級的框架無縫銜接撑瞧,比如MediaPlayer和Assets Library棵譬,使用這兩個框架所提供的服務并在需要更高級的功能時,也可以直接與Core Media和Core Audio進行交互预伺。
1.3 AV Foundation所提供的一些核心功能
1.3.1 音頻播放和記錄
AVAudioPlayer和AVAudioRecorder可以在應用程序中提供一種更簡單的整合音頻播放和記錄的功能订咸。但不是AV Foundation用于播放和記錄音頻的唯一方式。
1.3.2 媒體文件檢查
可以查看這些媒體資源信息酬诀,比如是否可以回放脏嚷、被編輯和導出。
獲取該媒體資源相關的技術參數(shù)瞒御,比如內(nèi)容持續(xù)時間父叙、創(chuàng)建日期或首選播放音量等。
該框架還基于AVMetadataltem類提供功能強大的元數(shù)據(jù)支持葵腹,允許開發(fā)者讀寫關于媒體資源的描述信息高每。
1.3.3 視頻播放
播放從本地文件或遠程流中獲取的視頻資源,并對視頻播放和內(nèi)容的展示進行控制践宴。
核心類:AVPlayer和AVPlayerItem鲸匿。
其他更高級的功能,如控制子標題和章節(jié)信息等阻肩〈叮或者讓你接連訪問音頻和視頻這兩個不同的資源。
1.3.4 媒體捕捉
核心類是AVCaptureSession烤惊,其作為所有活動的匯集點來接收攝像頭設備由各路流發(fā)過來的電影和圖片乔煞。
1.3.5 媒體編輯
允許創(chuàng)建可以將多個音頻和視頻資源進行組合的應用程序,允許修改和編輯獨立的媒體片段柒室、隨時修改音頻文件的參數(shù)以及添加動畫標題和場景切換效果渡贾。
1.3.6 媒體處理
訪問更底層的數(shù)據(jù)并對其進行操作。當需要執(zhí)行更高級的媒體處理任務時雄右,使用AVAssetReader和AVAssetWriter類來實現(xiàn)這些功能空骚。這些類提供直接訪問視頻幀和音頻樣本的功能纺讲,所以可以對媒體資源進行任何更高級的處理。
1.4 了解數(shù)字媒體
現(xiàn)實生活中的信號是連續(xù)的囤屹,信號的頻率和強度是在不斷變化的熬甚;但是數(shù)字世界的信號是離散的,由1和0兩個狀態(tài)表示肋坚。要將模擬信號轉換成我們能夠存儲并傳輸?shù)臄?shù)字信號乡括,要經(jīng)過模擬-數(shù)字轉換過程,我們將這個過程稱為采樣(Sampling)智厌。
1.4.1 數(shù)字媒體采樣
主要有兩種方式诲泌。
1、時間采樣:捕捉一個信號周期內(nèi)的變化峦剔。
2档礁、空間采樣:圖片數(shù)字化和其他可視化媒體內(nèi)容數(shù)字化的過程中角钩。
空間采樣包含對一幅圖片在一定分辨率之下捕捉其亮度和色度吝沫,進而創(chuàng)建由該圖片的像素點數(shù)據(jù)所構成的數(shù)字化結果。
當對一段視頻進行數(shù)字化時递礼,這兩種方式都可以使用惨险,因為通常的視頻信號既有空間屬性又有時間屬性。
1.4.2 音頻采樣
人類可以聽到的音頻范圍是20Hz~20kHz(20 000Hz)脊髓。
1.5 數(shù)字媒體壓縮
為縮小數(shù)字媒體文件的大小辫愉,我們需要對其使用壓縮技術。
1.5.1 色彩二次抽樣
視頻數(shù)據(jù)是使用稱之 為Y'CbCr顏色模式的典型案例将硝,Y'CbCr也常稱為YUV恭朗。
圖片的所有細節(jié)都保存在亮度通道中。眼睛對亮度的敏感度要高于顏色依疼,大幅減少存儲在每個像素中的顏色信息痰腮,而不至于圖片的質量嚴重受損。
減少顏色數(shù)據(jù)的過程就稱為色彩二次抽樣律罢。
攝像頭規(guī)范和其他視頻設備硬件或軟件中提到的4:4:4膀值、4:2:2及4:2:0時,這些值的含義就是這些設備所使用的色彩二次抽樣的參數(shù)误辑。根據(jù)這些值按如下格式將亮度比例表示為色度值沧踏,這個格式寫作J:a:b,具體含義如下:
J:幾個關聯(lián)色塊(一般是4個)中所包含的像素數(shù)巾钉。
a:用來保存位于第一行中的每個J像素的色度像素個數(shù)翘狱。
b:用來保存位于第二行中的每個J像素的附加像素個數(shù)。
1.5.2 編解碼器壓縮
大部分音頻和視頻都是使用編解碼器(codec)來壓縮的砰苍。編解碼器使用高級壓縮算法對需要保存或發(fā)送的音頻或視頻數(shù)據(jù)進行壓縮和編碼潦匈,同時它還可以將壓縮文件解碼成適合播放和編輯的媒體資源文件踏烙。
編解碼器既可以進行無損壓縮也可以進行有損壓縮。
無損壓縮編解碼器以一種可以完美重構解碼的方式對媒體文件進行壓縮历等,使其成為無論編輯還是發(fā)布都比較理想的文件讨惩。
有損編解碼器就是在壓縮過程中會有部分數(shù)據(jù)損失掉。
1.5.3 視頻編解碼器
AV Foundation提供有限的編解碼器集合寒屯,只提供蘋果公司認定的目前最主流的幾種媒體類型的支持荐捻。具體對于視頻文件來說,主要可以歸結為H.264和Apple ProRes寡夹。
- H.264
H.264規(guī)范是Motion Picture Experts Group(MPEG)所定義的MPEG-4的一部分处面。 H.264遵循早期的MEPG-1和MPEG-2標準,但是在以更低比特率得到更高圖片質量方面有了長足進步菩掏,使其更好地用 于流媒體文件和移動設備及視頻攝像頭魂角。
H.264與其他形式的MPEG壓縮一樣,通過以下兩個維度縮小了視頻文件的尺寸:
●空間:壓縮獨立視頻幀智绸,被稱為幀內(nèi)壓縮野揪。
●時間:通過以組為單位的視頻幀壓縮冗余數(shù)據(jù),這一過程稱為幀間壓縮瞧栗。
幀內(nèi)壓縮通過消除包含在每個獨立視頻幀內(nèi)的色彩及結構中的冗余信息來進行壓縮斯稳,因此可在不降低圖片質量的情況下盡可能縮小尺寸。幀內(nèi)壓縮也可以作為有損壓縮算法迹恐,但通常用于對原始圖片的一部分進行處理以生成極高質量的照片挣惰。通過這一過程創(chuàng)建的幀稱 為I-frames。
幀間壓縮中殴边,很多幀被組合在一起作為一組圖片(簡稱GOP)憎茂,對于GOP所存在的時間維度的冗余可以被消除。
GOP中的三個不同類型的幀锤岸。
●I-frames: 這些幀都是一些單獨的幀或關鍵幀竖幔,包含創(chuàng)建完整圖片需要的所有數(shù)據(jù)。每個GOP都正好有一個I-frames能耻。 由于它是一個獨立幀赏枚,其尺寸是最大的,但也是解壓最快的晓猛。
●P-frames: P-frames又稱為預測幀饿幅,是從基于最近I-frames或P-frames的可預測的圖片進行編碼得到的。P-frames 可以引用最近的預測P-frames或一組 I-frames戒职。你將會經(jīng)忱醵鳎看到這些被稱為“reference frames"的幀,臨近的P-frames和B-frames都可以對其進行引用洪燥。
●B-frames: B-frames 又稱為雙向幀磕秤,是基于使用之前和之后的幀信息進行編碼后得到的幀乳乌。幾乎不需要存儲空間,但其解壓過程會耗費較長時間市咆,因為它依賴于周圍其他的幀汉操。
H.264還支持編碼視圖,用于確定在整個編碼過程中所使用的算法蒙兰。共定義了3個高級標準:
●Baseline:這個標準通常用于對移動設備的媒體內(nèi)容進行處理磷瘤,提供了最低效的壓縮,因此經(jīng)過這個標準壓縮后的文件仍較大搜变,但是同時這種方法也是最少計算強度的方法采缚,因為它不支持B-frames。如果開發(fā)者的編譯目標是年代比較久遠的iOS設備挠他,比如iPhone 3GS扳抽,可能需要用到Baseline標準。
●Main: 這個標準的計算強度要比Baseline的高殖侵,因為它使用的算法更多贸呢,但可以達到比較高的壓縮率。
●High: 高標準的方法會得到最高質量的壓縮效果愉耙,但它也是3種方法中計算復雜度最高的贮尉,因為所有能用到的編碼技術和算法幾乎都用到了拌滋。
- Apple ProRes
專業(yè)編輯和生產(chǎn)工作流服務朴沿。
Apple ProRes編解碼器是獨立于幀的,意味著只有I-frames可以被使用败砂,這就使其更適合用在內(nèi)容編輯上赌渣。
Apple ProRes還使用可變比特率編碼的方式來對復雜場景中的每一幀進行編碼。
ProRes是有損編解碼器昌犹,但是它具有最高的編解碼質量坚芜。Apple ProRes 422使用4:2:2的色彩二次抽樣和10位的采樣深度。Apple ProRes 4444使用4:4:4色彩二次抽樣斜姥,具有最終4個用于表示支持無損alpha通道和高達12位的采樣深度鸿竖。
ProRes編解碼器只在OS X上可用。如果開發(fā)者只針對iOS進行開發(fā)工作铸敏,只能使用H.264缚忧。
注意:
對H.264和Apple ProRes來說,AV Foundation 還支持很多攝像頭設備的編解碼器杈笔,如MPEG-1闪水、MPEG-2、MPEG-4蒙具、H.263 和DV球榆,允許用戶以多種不同的視頻捕捉設備導入內(nèi)容資源朽肥。
1.5.4 音頻編解碼器
只要是Core Audio框 架支持的音頻編解碼,AV Foundation都可以支持持钉,這意味著AVFoundation能夠支持大量不同格式的資源衡招。然而在不用線性PCM音頻的情況下,更多的只能使用AAC每强。
AAC
高級音頻編碼(AAC)是H.264標準相應的音頻處理方式摧茴,目前已成為音頻流和下載的音頻資源中最主流的編碼方式容握。這種格式比MP3格式有著顯著的提升,可以在低比特率的前提下提供更高質量的音頻,是在Web上發(fā)布和傳播的音頻格式中最為理想的怖糊。此外,AAC沒有來自證書和許可方面的限制绍妨。
注意:
AVFoundation和CoreAudio提供對MP3數(shù)據(jù)解碼的支持志秃,但是不支持對其進行編碼。
1.6 容器格式
容器格式(container format):文件類型邢羔。
容器格式被認為是元文件格式驼抹。可將容器格式視為包含一種或更多種媒體類型(以及描述其內(nèi)容的元數(shù)據(jù))的目錄拜鹤。
每種格式都有一個規(guī)范用于確定文件的結構框冀。所謂的結構并不僅是其包含的媒體資源技術領域的問題,比如媒體的周期敏簿、編碼和時間信息明也,還定義了描述性原數(shù)據(jù)。這些元數(shù)據(jù)可以通過工具進行呈現(xiàn)惯裕。
當開發(fā)者使用AV Foundation撰寫代碼時温数,將遇到兩類主要的容器格式,它們分別是:
● QuickTime: QuickTime 是蘋果公司在更宏觀QuickTime架構中定義的最常用格式蜻势。
● MPEG-4: MPEG-4 Part14規(guī)范定義MPEG 4(MP4)容器格式撑刺。
1.7 初識AV Foundation
NSSpeechSynthesizer類:“文本到語音”功能∥章辏可以播放一個或多個語音內(nèi)容够傍,這些語音內(nèi)容都是名為AVSpeechUtterance的類的實例。
實現(xiàn)代碼如下所示:
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
@property (nonatomic, strong) AVSpeechSynthesizer *synthesizer;
@property (nonatomic, strong) NSArray *voices;
@property (nonatomic, strong) NSArray *speechStrings;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
for (NSUInteger i = 0; i < self.speechStrings.count; i++) {
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:self.speechStrings[i]];// 1
utterance.voice = self.voices[i % 2]; // 2在預先定義的兩個語音之間向后或向前進行切換
utterance.rate = 0.5f; // 3播放語音內(nèi)容的速率
utterance.pitchMultiplier = 0.8f; // 4改變聲音的音調(diào),介于0.5(低音調(diào))和2.0(高音調(diào))之間
utterance.postUtteranceDelay = 0.1f; // 5在播放下一語句之前有短時間的暫停
[self.synthesizer speakUtterance:utterance]; // 6播放
}
}
#pragma mark - 懶加載
- (AVSpeechSynthesizer *)synthesizer {
if (_synthesizer != nil) {
return _synthesizer;
}
_synthesizer = [[AVSpeechSynthesizer alloc] init];
return _synthesizer;
}
- (NSArray *)voices {
if (_voices != nil) {
return _voices;
}
_voices = @[[AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"],
[AVSpeechSynthesisVoice voiceWithLanguage:@"en-GB"]];
return _voices;
}
- (NSArray *)speechStrings {
if (_speechStrings != nil) {
return _speechStrings;
}
_speechStrings = @[@"Hello AV Foundation. How are you?",
@"I'm well! Thanks for asking.",
@"Are you excited about the book?",
@"Very! I have always felt so misunderstood.",
@"What's your favorite feature?",
@"Oh, they're all my babies. I couldn't possibly choose.",
@"It was great to speak with you!",
@"The pleasure was all mine! Have fun!"];
return _speechStrings;
}
@end