AVFoundation開發(fā)秘籍筆記-01AVFoundation入門

一、概述

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)行。

二乞巧、適用范圍

AVFoundtion_iOS.png
AVFoundation_OSX.png

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)行控制。核心類是AVPlayerAVPlayerItem椒袍,此外還可以整合其他更高級的功能驼唱,如控制子標(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ù)是佑力,可以用AVAssetReaderAVAssetWriter類來實(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.264Apple ProRes蔫慧。

3.1挠乳、H.264

H.264規(guī)范是Motion Picture Experts Group(MPEG)所定義的MPEG-4的一部分,H.264遵循早期的MPEG-1MPEG-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-framesP-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.264Apple ProRes來說迹淌,AV還支持很多攝像頭設(shè)備的編解碼器,如MPEG-1己单、MPEG-2唉窃、MPEG-4H.263DV纹笼,允許用戶以多種不同的視頻捕捉設(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沒有來自證書和許可方面的限制。

AVCore 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

八祖灰、任務(wù):閱讀AVFoundation文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仇哆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夫植,更是在濱河造成了極大的恐慌讹剔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件详民,死亡現(xiàn)場離奇詭異延欠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沈跨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門由捎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饿凛,你說我怎么就攤上這事狞玛∪沓郏” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵心肪,是天一觀的道長锭亏。 經(jīng)常有香客問我,道長硬鞍,這世上最難降的妖魔是什么慧瘤? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮固该,結(jié)果婚禮上锅减,老公的妹妹穿的比我還像新娘。我一直安慰自己伐坏,他們只是感情好怔匣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桦沉,像睡著了一般劫狠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上永部,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天独泞,我揣著相機(jī)與錄音,去河邊找鬼苔埋。 笑死懦砂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的组橄。 我是一名探鬼主播荞膘,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼玉工!你這毒婦竟也來了羽资?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遵班,失蹤者是張志新(化名)和其女友劉穎屠升,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狭郑,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腹暖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翰萨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脏答。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殖告,到底是詐尸還是另有隱情阿蝶,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布黄绩,位于F島的核電站羡洁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宝与。R本人自食惡果不足惜焚廊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一冶匹、第九天 我趴在偏房一處隱蔽的房頂上張望习劫。 院中可真熱鬧,春花似錦嚼隘、人聲如沸诽里。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谤狡。三九已至,卻和暖如春卧檐,著一層夾襖步出監(jiān)牢的瞬間墓懂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工霉囚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捕仔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓盈罐,卻偏偏與公主長得像榜跌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盅粪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容