關(guān)于音頻播放的那點(diǎn)兒事兒(一) 初探iOS音頻 CoreAudio Essentials

CoreAudio的編程接口分為3層弃衍,如下圖所示


來源于蘋果文檔

Low-Level Services包含:

1.I/O Kit:驅(qū)動

2.AudioHAL:音頻硬件抽象層,為硬件提供一個設(shè)備獨(dú)立、驅(qū)動獨(dú)立的接口

3.Core MIDI:提供服務(wù)于MIDI流和設(shè)備的軟件抽象

4.Host Time Services:提供訪問計(jì)算機(jī)時鐘

Mac apps 可以被創(chuàng)建成直接應(yīng)用這些技術(shù),當(dāng)它們需要盡可能實(shí)時的性能氯质。然而,很多音頻程序并不能訪問這些層級祠斧。事實(shí)上,在iOS中核心音頻為實(shí)現(xiàn)實(shí)時音頻運(yùn)用更高層級接口提供方法拱礁。OpenAL, 舉個例子琢锋,在游戲中為實(shí)時音頻使用I/O,但是實(shí)際是確實(shí)一個小得多呢灶,轉(zhuǎn)換API適當(dāng)?shù)脑O(shè)置移動設(shè)備吴超。

在核心音頻中Middle-Level Layer,包括數(shù)據(jù)格式轉(zhuǎn)換鸯乃、硬盤的讀寫鲸阻,解析劉文建跋涣,還要插件的使用。

1.Audio Converter Services:讓應(yīng)用程序處理音頻數(shù)據(jù)格式轉(zhuǎn)換鸟悴。

2.Audio File Services:讀寫基于硬盤的音頻數(shù)據(jù)陈辱。可以解析采樣頻率细诸、碼率沛贪、時長等信息,分離音頻文件的音頻幀

3.Audio Unit Services(播放音頻數(shù)據(jù)) 和 Audio Processing Graph Services(音效處理模塊):讓應(yīng)用程序處理DSP(數(shù)字信號處理)插件震贵,像均衡器和混音器利赋。

4.Audio File Stream Services:讓你創(chuàng)建的應(yīng)用程序可以解析音頻流文件,就像通過網(wǎng)絡(luò)連接播放流文件猩系。

5.Core Audio Clock Services:支持音頻和MIDI同步以及基于時間的轉(zhuǎn)換媚送。

6.Audio Format Services(一個小的API, 在圖中并沒有展示),協(xié)助管理應(yīng)用程序中的音頻數(shù)據(jù)格式寇甸。

在iOS中核心音頻提供這些服務(wù)的一大部分:在核心音頻 High-level Services包括結(jié)合了較低層特點(diǎn)的更直接的接口塘偎。

1.Audio Queue Services提供你記錄、播放幽纷、暫停式塌、循環(huán)和同步音頻。它使用必要的編解碼器去壓縮音頻格式友浸。

2.AVAudioPlayer:為播放音頻和循環(huán)提供了一個簡單的OC接口峰尝,以及實(shí)現(xiàn)快進(jìn)和快退。高級接口收恢,可以完成整個音頻播放過程武学,但是不能實(shí)現(xiàn)混音器和均衡器功能。

3.Extended Audio File Services:結(jié)合了Audio File Services和 Aduio Converter Services的特點(diǎn)伦意。它給你提供了一個用于讀寫未壓縮和壓縮聲音文件火窒。

4.OpenAL是定位音頻的開源OpenAL標(biāo)準(zhǔn)的核心音頻的實(shí)現(xiàn)。它是建立在系統(tǒng)提供的3D混音器音頻單元的頂部驮肉。所有的應(yīng)用程序都可以使用OpenAL熏矿,盡管它最合適用于游戲開發(fā)。

音頻一般播放的流程:

1.讀取音頻文件

2.解析采樣頻率离钝、碼率票编、時長等信息,分離音頻文件的音頻幀卵渴。? ??

? ? ? ? Audio File Service 讀寫音頻數(shù)據(jù)慧域,Audio File Stream Services:對音頻進(jìn)行解碼

3.對分離出來的音頻真解碼得到PCM數(shù)據(jù)?

? ? ? ? Audio Converter services:音頻數(shù)據(jù)轉(zhuǎn)換
4.對PCM數(shù)據(jù)進(jìn)行音效處理(均衡器、混音器浪读,非必須的)?

? ? ? ? ?Audio Process Graph Services:音效處理模塊

5.把PCM數(shù)據(jù)解碼成音頻信號6.把音頻信號交給硬件播放?

? ? ? ? ?Aduio Unit Services:播放音頻數(shù)據(jù)

7.重復(fù)1-6步?

Framework

直到播放完成如上就是音頻核心API三個層級以及各個層級內(nèi)容的功能關(guān)于Framework這里只關(guān)注與iOS有關(guān)系的.

AudioToolbox.framework :Audio Session Services:作為管理你應(yīng)用程序在手機(jī)和iPod設(shè)備中的音頻行為昔榴。

AudioUnit.framework:Audio Unit Services

AVFoundation.framework:提供AVAudioPlayer class

CoreAudio.framework:提供跨核心音頻以及底層服務(wù)接口的數(shù)據(jù)類型辛藻。
OpenAL.framework:OpenAL
?iOS不支持的有:CoreAudioKit.framework ? CoreMIDI.frame ? ?CoreMIDIServer.framework

?附錄CoreAudio framework 描述了所有這些框架,以及他們包含的頭文件互订。

Proxy Objects:

核心音頻運(yùn)用代理對象的概念來表示注入文件吱肌、流、音頻播放器等等屁奏。當(dāng)你希望你的應(yīng)用程序使用磁盤上的音頻文件岩榆,舉個例子,第一步是將音頻文件對象實(shí)例化為AudioFileID類型坟瓢。這個對象在AudioFile.h頂部被聲明為一個不透明的數(shù)據(jù)結(jié)構(gòu)勇边。

typedef struct OpaqueAudioFileID *AudioFileID;

你實(shí)例化一個音頻文件對象,并且創(chuàng)建一個實(shí)際的音頻文件綁定到一個調(diào)用AduioFileCreateWithURL函數(shù)的對象折联。該函數(shù)給你一個新的音頻文件對象的引用粒褒。從那時起,你才通過代理使用真正的音頻文件诚镰。

這種機(jī)制貫穿整個核心音頻奕坟,無論是你播放音頻文件、iPhone audio sessions 更甚者是硬件設(shè)備清笨。

Properties, Scopes, and Elements

大部分核心音頻接口運(yùn)用屬性機(jī)制來管理對象狀態(tài)和精簡對象行為月杉。屬性就是鍵值對。

屬性key值是特殊的枚舉變量縮寫抠艾,諸如kAudioFileProperyFileFormar或者kAudioQueueDevicePropery_NumberChannels.

屬性value值是一個特定的數(shù)據(jù)類型苛萎,合適的目標(biāo)屬性-void、Float64检号、 AudioChannelLayout結(jié)構(gòu)等等腌歉。

這里有很多蘋果定義的屬性。你將會在Core Audio framework的頭文件中找到他們的定義齐苛。有些核心音頻的接口翘盖,如Audio Unit Services, 也讓你自己定義自己的屬性凹蜂。

核心音頻接口運(yùn)用存儲器函數(shù)取回一個對象的屬性值馍驯,如果是一個可寫的屬性,修改它的值玛痊。你也會找到一個第三方的存儲器來獲取屬性的信息泥彤。例如,Audio Unit Services的AudioUnitGetProperyInfo告訴你一個給定的屬性值的數(shù)據(jù)類型大小以及是否可以修改它卿啡。Audio Queue Services的AudioQueueGetPropertySize獲取指定屬性值得大小。

核心音頻接口提供一個通知你app屬性值是否改變的機(jī)制菱父。你可以在Callback Functions:Interacting with Core Audio中讀到颈娜。

在某些情況下剑逃,屬性應(yīng)用于作為整體的音頻對象。例如官辽,在回放的音頻隊(duì)列中計(jì)算音頻level(啥意思蛹磺。。level???)同仆,你可以設(shè)置他的kAudioQueueProperty_EnableLabelMetering 的屬性為true.

其他核心音頻對象有內(nèi)部的結(jié)構(gòu)萤捆,每一個都有他們特殊的的屬性設(shè)置。例如俗批,一個音頻單元有輸入俗或、輸出和全局范圍。一個音頻單元的輸入或者輸出都由一個或者多個屬性組成岁忘,每一個元素類似于音頻硬件中的信道總線辛慰。當(dāng)你用kAudioUnitPropery_AudioChannelLayout屬性調(diào)用AudioUnitGetPropery函數(shù),你不僅指定你想要的音頻單元信息而且是范圍和元素干像。

參考:iOS音頻播放 (一):概述

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帅腌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子麻汰,更是在濱河造成了極大的恐慌速客,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件五鲫,死亡現(xiàn)場離奇詭異溺职,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)臣镣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門辅愿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忆某,你說我怎么就攤上這事点待。” “怎么了弃舒?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵癞埠,是天一觀的道長。 經(jīng)常有香客問我聋呢,道長苗踪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任削锰,我火速辦了婚禮通铲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘器贩。我一直安慰自己颅夺,他們只是感情好朋截,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吧黄,像睡著了一般部服。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拗慨,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天廓八,我揣著相機(jī)與錄音,去河邊找鬼赵抢。 笑死剧蹂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昌讲。 我是一名探鬼主播国夜,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼短绸!你這毒婦竟也來了车吹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤醋闭,失蹤者是張志新(化名)和其女友劉穎窄驹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體证逻,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乐埠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了囚企。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈咐。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖龙宏,靈堂內(nèi)的尸體忽然破棺而出棵逊,到底是詐尸還是另有隱情,我是刑警寧澤银酗,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布辆影,位于F島的核電站,受9級特大地震影響黍特,放射性物質(zhì)發(fā)生泄漏蛙讥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一灭衷、第九天 我趴在偏房一處隱蔽的房頂上張望次慢。 院中可真熱鬧,春花似錦、人聲如沸经备。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侵蒙。三九已至,卻和暖如春傅蹂,著一層夾襖步出監(jiān)牢的瞬間纷闺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工份蝴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犁功,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓婚夫,卻偏偏與公主長得像浸卦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子案糙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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