一、概述
AVFoundation是可以用它來播放和創(chuàng)建基于時間的視聽媒體的幾個框架之一纠亚,它提供了基于時間的視聽數(shù)據(jù)的詳細(xì)界別上的OC接口〗钕模可以用它來檢查蒂胞、創(chuàng)建、編輯条篷、重新編碼媒體文件骗随。也可以從設(shè)備得到輸入流和實(shí)時捕捉回放過程中操控視頻
用于處理基于時間的媒體數(shù)據(jù)的高級OC框架。充分利用了多核硬件的優(yōu)勢并大量使用block和Grand Central Dispatch(GCD)機(jī)制將復(fù)雜的計(jì)算進(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)換并管理視頻同步事項(xiàng)使得復(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處于高層級框架和低層級框架之間暇矫,提供了很多低層級框架才能實(shí)現(xiàn)的功能和性能主之,并且是以更簡單的OC接口方式實(shí)現(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
,作為所有活動的匯集點(diǎn)來接受攝像頭設(shè)備由各路流反過來的電影和圖片优俘。是用來管理數(shù)據(jù)捕捉的中央?yún)f(xié)調(diào)對象纽窟,使用一個實(shí)例來協(xié)調(diào)從AV輸入設(shè)備到輸出的數(shù)據(jù)流。 - 5兼吓、媒體編輯臂港。對媒體資源的整合和編輯提供了強(qiáng)有力的支持。允許修改和編輯獨(dú)立的媒體片段、隨時修改音頻文件的參數(shù)以及添加動畫標(biāo)題和場景切換效果审孽。
- 6县袱、媒體處理。當(dāng)需要執(zhí)行更高級的媒體處理任務(wù)是佑力,可以用
AVAssetReader
和AVAssetWriter
類來實(shí)現(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。
如果每個像素點(diǎn)使用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、空間:壓縮獨(dú)立視頻幀阐枣,稱為幀內(nèi)壓縮
- 2马靠、時間:通過以組為單位的視頻幀壓縮冗余數(shù)據(jù),稱為幀間壓縮
幀內(nèi)壓縮蔼两,通過消除包含在每個獨(dú)立視頻幀內(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)鍵幀赃蛛,或者單獨(dú)的幀,包含創(chuàng)建完整圖片所需要的所有數(shù)據(jù)搀菩,每個GOP都正好有一個I-Frames
焊虏。由于它是一個獨(dú)立幀,其尺寸是最大的秕磷,但也是壓縮最快的诵闭。 - 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)行編碼后得到的幀。幾乎不需要存儲空間造寝,但其解碼過程會耗費(fèi)很長時間磕洪,因?yàn)樗蕾囉谥車渌膸?/li>
H.264
還支持編碼視圖,用于確定在整個編碼過程中所使用的算法定義三個高級標(biāo)準(zhǔn):
- 1诫龙、
Baseline
:通常用于對移動設(shè)備的媒體內(nèi)容進(jìn)行處理析显,提供最低效的壓縮,因此經(jīng)過這個標(biāo)準(zhǔn)壓縮后的文件仍較大签赃,但同時這種方法也是最少計(jì)算強(qiáng)度的方法谷异,因?yàn)樗恢С?code>B-frames。如果編譯目標(biāo)是比較久遠(yuǎn)的iOS設(shè)備锦聊,可能需要用到Baseline
標(biāo)準(zhǔn)歹嘹。 - 2、
Main
:這個標(biāo)準(zhǔn)的計(jì)算強(qiáng)度比Baseline
的高孔庭,使用的算法更多尺上,但可以達(dá)到較高的壓縮率 - 3、
High
:高標(biāo)準(zhǔn)的方法會得到最高質(zhì)量的壓縮效果史飞,但它也是三總方法中計(jì)算復(fù)雜度最高的尖昏,因?yàn)樗心苡玫降木幋a技術(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
實(shí)現(xiàn)文本到語音功能换棚。這個類用來播放一個或多個語音內(nèi)容扒披,這些語音內(nèi)容為AVSpeechUtterance
的類的實(shí)例。
e.g.
#import "LFSpeechViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface LFSpeechViewController ()
//執(zhí)行具體的“文本到語音”回話圃泡。對于一個或多個AVSpeechUtterance實(shí)例碟案,
//該對象起到隊(duì)列的作用,提供了接口供控制和見識正在進(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)行計(jì)算领迈。
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