一、概述
AVFoundation是可以用它來播放和創(chuàng)建基于時間的視聽媒體的幾個框架之一,它提供了基于時間的視聽數(shù)據(jù)的詳細(xì)界別上的OC接口。可以用它來檢查、創(chuàng)建、編輯、重新編碼媒體文件。也可以從設(shè)備得到輸入流和實時捕捉回放過程中操控視頻
用于處理基于時間的媒體數(shù)據(jù)的高級OC框架。充分利用了多核硬件的優(yōu)勢并大量使用block和Grand Central Dispatch(GCD)機(jī)制將復(fù)雜的計算進(jìn)程放在后臺線程運(yùn)行。自動提供硬件加速操作,確保在大部分設(shè)備上應(yīng)用程序能以最佳性能運(yùn)行。
二、適用范圍
AV Foundation的幾個最主要的支撐框架及其提供的功能:
Core Audio
OSX和iOS上處理所有音頻事件的框架,是由多個框架整合在一起的總稱。為音頻和MIDI內(nèi)容的錄制、播放和處理提供相應(yīng)接口,也提供高層級的接口,比容通過Audio Queue Services框架所提供的那些接口,主要處理基本的音頻播放和錄音相關(guān)功能。也提供相對低層級的接口。Core Video
針對數(shù)字視頻所提供的管道模式。Core Video為其相對的Core Media提供圖片緩存和緩存池支持,提供了一個能夠?qū)?shù)字視頻逐幀訪問的接口。該框架通過像素格式之間的轉(zhuǎn)換并管理視頻同步事項使得復(fù)雜的工作得到了有效簡化。Core Media
低層級媒體管道的一部分,它提供折痕對音頻樣本和視頻幀處理所需的低層級數(shù)據(jù)類型和接口。還提供了AV用到的基于CMTime數(shù)據(jù)類型的時基模型。CMTime及其相關(guān)數(shù)據(jù)類型一般在AV處理基于時間的操作時使用。Core Animation
合成及動畫相關(guān)框架。主要功能是提供蘋果平臺所具有的美觀、流暢的動畫小狗。提供一個簡單、聲明性編程模式,并已經(jīng)封裝了支持OpenGL和OpenGL ES功能的基于OC的各種累。使用Core Animation時,對于視頻內(nèi)容的播放和視頻不捕捉這兩個動作?AV還可以利用Core Animation在視頻編輯和播放過程中添加動畫標(biāo)題和圖片效果。
AV處于高層級框架和低層級框架之間,提供了很多低層級框架才能實現(xiàn)的功能和性能,并且是以更簡單的OC接口方式實現(xiàn),同時也可以和高層級框架無縫連接。
三、AV功能分解
- 1、音頻播放和記錄。播放音頻文件可以使用
AVAudioPlayer
,錄制音頻文件可以使用AVAudioRecorder
。還可以使用AVAudioSession
來配置應(yīng)用程序的音頻行為。 - 2、媒體文件檢查。提供檢查正在使用的媒體文件的功能。可以查看媒體資源信息,比如是否可以回放、編輯、導(dǎo)出等,可以獲取相關(guān)技術(shù)參數(shù),比如內(nèi)容持續(xù)時間,創(chuàng)建日期、播放音量等,此外還基于
AVMetadataItem
類提供功能強(qiáng)大的元數(shù)據(jù)支持。允許開發(fā)者讀取關(guān)于媒體資源的描述信息。 - 3、視頻播放。AV提供可以播放從本地或者遠(yuǎn)程流中獲取的視頻資源,并對視頻播放和內(nèi)容的展示進(jìn)行控制。核心類是
AVPlayer
和AVPlayerItem
,此外還可以整合其他更高級的功能,如控制子標(biāo)題和章節(jié)信息等。 - 4、媒體捕捉。核心類是
AVCaptureSession
,作為所有活動的匯集點來接受攝像頭設(shè)備由各路流反過來的電影和圖片。是用來管理數(shù)據(jù)捕捉的中央?yún)f(xié)調(diào)對象,使用一個實例來協(xié)調(diào)從AV輸入設(shè)備到輸出的數(shù)據(jù)流。 - 5、媒體編輯。對媒體資源的整合和編輯提供了強(qiáng)有力的支持。允許修改和編輯獨立的媒體片段、隨時修改音頻文件的參數(shù)以及添加動畫標(biāo)題和場景切換效果。
- 6、媒體處理。當(dāng)需要執(zhí)行更高級的媒體處理任務(wù)是,可以用
AVAssetReader
和AVAssetWriter
類來實現(xiàn)這些功能。這些類提供了直接訪問視頻幀和音頻樣本的功能,可以對媒體資源進(jìn)行任何更高級的處理。
四、了解數(shù)字媒體
了解信號的數(shù)字化過程。
視頻文件一秒內(nèi)所能展現(xiàn)的幀數(shù)成為視頻的幀率,用FPS作為單位進(jìn)行測量。常見的幀率是24FPS、25FPS、30FPS。
目前視頻最流行的寬高比是16:9,意思是沒16個水平像素對應(yīng)9個垂直像素。常見視頻尺寸為1280*720,1920*1080。
如果每個像素點使用8位RGB色彩空間,這意味著紅色8位,綠色8位,藍(lán)色8位。
現(xiàn)在問題來了,一個幀率為30FPS,分辨率是1920*1080的視頻存儲需求就是:1920*1080 * 30 * 24 (b/s)
五、數(shù)字媒體壓縮
為縮小數(shù)字媒體文件大小,需要對齊使用壓縮技術(shù)。
1、色彩二次抽樣
視頻數(shù)據(jù)是使用YCbCr顏色模式的典型案例,也常稱為YUV。
對RGB模式來說,每個像素是由紅、綠、藍(lán)三種顏色組合而成,而YUV使用的是色彩通道UV(顏色)替換了像素的亮度通道Y(亮度)。眼睛對于亮度的敏感度要高于顏色,所以可以大幅度減少存儲在每個像素中的顏色信息,不至于是圖片質(zhì)量嚴(yán)重受損,減少顏色數(shù)據(jù)的過程就成為色彩二次抽樣。
2、編解碼器壓縮。
大部分音頻和視頻都是使用編解碼器(codec)來壓縮的,即編碼器和解碼器(encoder/decoder)。編解碼器使用高級壓縮算法對需要保存或發(fā)送的音頻或視頻數(shù)據(jù)進(jìn)行壓縮和編碼,同時還可以將壓縮文件解碼成為適合播放和編輯的媒體資源。編解碼器可以進(jìn)行無損壓縮也可以機(jī)型有損壓縮。
3、視頻編解碼器。
對于視頻編輯碼而言,AV提供有限的編解碼器集合,只提供蘋果公司認(rèn)定的最主流的幾種媒體類型的支持。對視頻文件主要可以歸結(jié)為H.264
和Apple ProRes
。
3.1、H.264
H.264規(guī)范是Motion Picture Experts Group(MPEG)
所定義的MPEG-4
的一部分,H.264
遵循早期的MPEG-1
和MPEG-2
標(biāo)準(zhǔn),但在以更低比特率得到更高圖片質(zhì)量方面有了長足進(jìn)步,使其更好地使用與流媒體文件和移動設(shè)備及視頻攝像頭。
H.264
與其他形式的MPEG
壓縮一樣,通過以下兩個緯度縮小了視頻文件的大小:
- 1、空間:壓縮獨立視頻幀,稱為幀內(nèi)壓縮
- 2、時間:通過以組為單位的視頻幀壓縮冗余數(shù)據(jù),稱為幀間壓縮
幀內(nèi)壓縮,通過消除包含在每個獨立視頻幀內(nèi)的色彩及結(jié)構(gòu)中的冗余信息來進(jìn)行壓縮,因此可在不降低圖片質(zhì)量的情況小盡可能縮小尺寸。這類壓縮類似JEPG壓縮,幀內(nèi)壓縮可以作為有損壓縮算法,通常用于對原始圖片的一部分進(jìn)行處理以生成極高質(zhì)量的照片,通過這一過程創(chuàng)建的幀成為I-frames
。
幀間壓縮,很多幀被組合在一起成為一組圖片(簡稱GOP),對于GOP所存在的時間維度的冗余可以被消除。在一個時間維度上的冗余,如視頻的固定背景環(huán)境,就可以通過壓縮的方式進(jìn)行消除。
GOP中三種不同的幀:
- 1、
I-frames
:關(guān)鍵幀,或者單獨的幀,包含創(chuàng)建完整圖片所需要的所有數(shù)據(jù),每個GOP都正好有一個I-Frames
。由于它是一個獨立幀,其尺寸是最大的,但也是壓縮最快的。 - 2、
P-frames
:預(yù)測幀,是從基于最近I-frames
或P-frames
的可預(yù)測的圖片進(jìn)行編碼得到的。P-frames
可以引用最近的預(yù)測幀P-frames
或一組I-frames
。你將會經(jīng)常看到被稱為“Reference frames”
的幀,臨近的P-frames和B-Frames都可以對其進(jìn)行引用。 - 3、
B-frames
:雙向幀,基于使用之前和之后的幀信息進(jìn)行編碼后得到的幀。幾乎不需要存儲空間,但其解碼過程會耗費很長時間,因為它依賴于周圍其他的幀。
H.264
還支持編碼視圖,用于確定在整個編碼過程中所使用的算法定義三個高級標(biāo)準(zhǔn):
- 1、
Baseline
:通常用于對移動設(shè)備的媒體內(nèi)容進(jìn)行處理,提供最低效的壓縮,因此經(jīng)過這個標(biāo)準(zhǔn)壓縮后的文件仍較大,但同時這種方法也是最少計算強(qiáng)度的方法,因為它不支持B-frames
。如果編譯目標(biāo)是比較久遠(yuǎn)的iOS設(shè)備,可能需要用到Baseline
標(biāo)準(zhǔn)。 - 2、
Main
:這個標(biāo)準(zhǔn)的計算強(qiáng)度比Baseline
的高,使用的算法更多,但可以達(dá)到較高的壓縮率 - 3、
High
:高標(biāo)準(zhǔn)的方法會得到最高質(zhì)量的壓縮效果,但它也是三總方法中計算復(fù)雜度最高的,因為所有能用到的編碼技術(shù)和算法幾乎都用到了。
3.2、Apple ProRes
ProRes
編解碼器只在OSX上使用,針對iOS進(jìn)行開發(fā),只能使用H.264
。
對
H.264
和Apple ProRes
來說,AV還支持很多攝像頭設(shè)備的編解碼器,如MPEG-1
、MPEG-2
、MPEG-4
、H.263
和DV
,允許用戶以多種不同的視頻捕捉設(shè)備導(dǎo)入內(nèi)容資源。
4、音頻編解碼器
只要是Core Audio
框架支持的音頻編解碼,AV都可以支持。意味著AV可以支持大量不同格式的資源,然而在不適用線性PCM音頻的情況下,更多的只能使用AAC。
AAC
,高級音頻編碼是H.264
標(biāo)準(zhǔn)相應(yīng)的音頻處理方式,目前已成為音頻流和下載的音頻資源中最主流的編碼方式。這種格式比MP3格式有顯著的提升,可以在低比特率的前提下提供更高質(zhì)量的音頻,在web上發(fā)布和傳播的音頻格式中最為理想的。AAC
沒有來自證書和許可方面的限制。
AV
和Core Audio
提供對MP3數(shù)據(jù)解碼的支持,但不支持對齊進(jìn)行編碼。
六、容器格式
容器格式(container fromat)就是文件類型,或者說文件格式,比如.mov
、.mp4
、.mpg
、avi
等。
容器格式被認(rèn)為是元文件格式,可以將容器格式視為包含一種或者更多種媒體類型(以及描述其內(nèi)容的元數(shù)據(jù))的目錄。
每種格式都有一個規(guī)范用于確定文件的機(jī)構(gòu),所謂的結(jié)構(gòu)并不僅是其包含的媒體資源技術(shù)領(lǐng)域的問題,比如媒體的周期、編碼和時間信息,還定義了默哀屬性還原數(shù)據(jù),比如電影標(biāo)題或一首歌的作者信息等。這些元數(shù)據(jù)可以通過工具進(jìn)行呈現(xiàn)。
使用AV是,將遇到兩種主要的容器格式:
- 1、
QuickTime
,是蘋果公式在更宏觀QuickTime
架構(gòu)中定義的最常用格式。需閱讀文檔了解。 - 2、
MPEG-4
,MP4容器格式官方文件擴(kuò)展名是.mp4
,也有很多不同的變化擴(kuò)展名也在使用。
七、AVFoundation文本到語音功能
通過AVSpeechSynthesizer
實現(xiàn)文本到語音功能。這個類用來播放一個或多個語音內(nèi)容,這些語音內(nèi)容為AVSpeechUtterance
的類的實例。
e.g.
#import "LFSpeechViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface LFSpeechViewController ()
//執(zhí)行具體的“文本到語音”回話。對于一個或多個AVSpeechUtterance實例,
//該對象起到隊列的作用,提供了接口供控制和見識正在進(jìn)行的語音播放。
@property (nonatomic,strong) AVSpeechSynthesizer *synthesizer;
@property (nonatomic,strong) NSArray *voicesArray;
@property (nonatomic,strong) NSArray *speechStringsArray;
@end
@implementation LFSpeechViewController
- (void)viewDidLoad {
[super viewDidLoad];
_synthesizer = [[AVSpeechSynthesizer alloc] init];
_voicesArray = @[[AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"],[AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"],];
// AVSpeechSynthesisVoice 設(shè)置語音支持。
// [AVSpeechSynthesisVoice speechVoices]獲取所有支持的語音類型。
_speechStringsArray = [self buildSpeechStrings];
NSLog(@"%@",[AVSpeechSynthesisVoice speechVoices]);
}
- (IBAction)beginButtonClicked:(UIButton *)sender {
[self beginConversation];
}
- (void)beginConversation {
for (int i = 0; i < self.speechStringsArray.count; i++) {
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:self.speechStringsArray[i]];
utterance.voice = self.voicesArray[i%2];//語音
utterance.rate = 0.4f;
//播放語音內(nèi)容的速率,默認(rèn)值A(chǔ)VSpeechUtteranceDefaultSpeechRate=0.5。
//這個值介于AVSpeechUtteranceMinimumSpeechRate和AVSpeechUtteranceMaximumSpeechRate之間(目前是0.0-1.0)
//這兩個值是常量,在以后iOS版本中可能會發(fā)生變化,可以按照最小值和最大值的范圍百分比進(jìn)行計算。
NSLog(@"min:%f-max:%f-default:%f",AVSpeechUtteranceMinimumSpeechRate,AVSpeechUtteranceMaximumSpeechRate,AVSpeechUtteranceDefaultSpeechRate);
utterance.pitchMultiplier = 0.8f; //在播放特定語句是改變聲音的音調(diào),允許值介于0.5-2.0之間。
utterance.postUtteranceDelay = 0.1f; //語音合成器在播放下一語句之前有段時間的暫停。
[self.synthesizer speakUtterance:utterance];
}
}
- (NSArray *)buildSpeechStrings {
return @[@"Hello,How are you ?",
@"I'm fine ,Thank you. And you ?",
@"I'm fine too.",
@"人之初,性本善。性相近,習(xí)相遠(yuǎn)。茍不教,性乃遷。教之道,貴以專。昔孟母,擇鄰處。子不學(xué),斷機(jī)杼。竇燕山,有義方。教五子,名俱揚(yáng)。養(yǎng)不教,父之過。教不嚴(yán),師之惰。子不學(xué),非所宜。幼不學(xué),老何為。玉不琢,不成器。人不學(xué),不知義。為人子,方少時。親師友,習(xí)禮儀。香九齡,能溫席。孝于親,所當(dāng)執(zhí)。融四歲,能讓梨。弟于長,宜先知。",
];
}
@end