AudioUnit框架詳細解析(十五) —— 音頻流格式啟用數據流之使用AudioStreamBasicDescription結構(一)

版本記錄

版本號 時間
V1.0 2018.06.28

前言

AudioUnit框架作為您的應用程序添加復雜的音頻操作和處理功能蔗草。 創(chuàng)建在主機應用程序中生成或修改音頻的音頻單元擴展间螟。接下來幾篇我們就一起看一下這個框架,感興趣的看上面幾篇文章。
1. AudioUnit框架詳細解析(一) —— 基本概覽
2. AudioUnit框架詳細解析(二) —— 關于Audio Unit Hosting之概覽(一)
3. AudioUnit框架詳細解析(三) —— 關于Audio Unit Hosting之如何使用本文檔和參考資料(二)
4. AudioUnit框架詳細解析(四) —— 音頻單元提供快速的模塊化音頻處理之iOS中的Audio Units(一)
5. AudioUnit框架詳細解析(五) —— 音頻單元提供快速的模塊化音頻處理之在Concert中使用兩個音頻單元API(二)
6. AudioUnit框架詳細解析(六) —— 音頻單元提供快速的模塊化音頻處理之使用標識符來指定和獲取音頻單元(三)
7. AudioUnit框架詳細解析(七) —— 音頻單元提供快速的模塊化音頻處理之使用范圍和元素來指定音頻單元的部分(四)
8. AudioUnit框架詳細解析(八) —— 音頻單元提供快速的模塊化音頻處理之使用屬性來配置音頻單元(五)
9. AudioUnit框架詳細解析(九) —— 音頻單元提供快速的模塊化音頻處理之使用參數和UIKit為用戶提供控制(六)
10. AudioUnit框架詳細解析(十) —— 音頻單元提供快速的模塊化音頻處理之I / O單元的基本特性(七)
11. AudioUnit框架詳細解析(十一) —— 音頻處理圖管理音頻單元之音頻處理圖具有一個I / O單元(一)
12. AudioUnit框架詳細解析(十二) —— 音頻處理圖管理音頻單元之音頻處理圖提供線程安全性(二)
13. AudioUnit框架詳細解析(十三) —— 音頻處理圖管理音頻單元之音頻使用Pull通過圖表(三)
14. AudioUnit框架詳細解析(十四) —— 呈現回調函數將音頻饋送到音頻單元之了解音頻單元呈現回調函數(一)

Audio Stream Formats Enable Data Flow - 音頻流格式啟用數據流

在使用單個采樣級別的音頻數據時竭沫,與使用音頻單元時一樣播聪,僅指定正確的數據類型來表示音頻是不夠的癣猾。 單個音頻采樣值中bits的布局具有含義慕蔚,因此像Float32UInt16這樣的數據類型不夠表達。 在本節(jié)中巍佑,您將了解Core Audio解決此問題的方法


Working with the AudioStreamBasicDescription structure - 使用AudioStreamBasicDescription結構

音頻值在您的應用程序以及您的應用程序和音頻硬件之間移動的流是AudioStreamBasicDescription結構茴迁,如Listing 1-6所示,并在Core Audio Data Types Reference中進行了完整描述萤衰。

Listing 1-6 The AudioStreamBasicDescription structure

  struct AudioStreamBasicDescription {
      Float64 mSampleRate;
      UInt32  mFormatID;
      UInt32  mFormatFlags;
      UInt32  mBytesPerPacket;
      UInt32  mFramesPerPacket;
      UInt32  mBytesPerFrame;
      UInt32  mChannelsPerFrame;
      UInt32  mBitsPerChannel;
      UInt32  mReserved;
  };
  typedef struct AudioStreamBasicDescription  AudioStreamBasicDescription;

由于名稱AudioStreamBasicDescription很長堕义,因此在對話和文檔中通常會縮寫為ASBD。 要為ASBD的字段定義值脆栋,請編寫類似于Listing 1-7中所示的代碼倦卖。

Listing 1-7 Defining an ASBD for a stereo stream

size_t bytesPerSample = sizeof (AudioUnitSampleType);
AudioStreamBasicDescription stereoStreamFormat = {0};

stereoStreamFormat.mFormatID  = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags  = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket = bytesPerSample;
stereoStreamFormat.mBytesPerFrame = bytesPerSample;
stereoStreamFormat.mFramesPerPacket   = 1;
stereoStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
stereoStreamFormat.mChannelsPerFrame  = 2;           // 2 indicates stereo
stereoStreamFormat.mSampleRate        = graphSampleRate;

首先,確定數據類型以表示一個音頻采樣值椿争。 本示例使用AudioUnitSampleType定義的類型怕膛,這是大多數音頻單元的推薦數據類型。 在iOS中秦踪,AudioUnitSampleType被定義為8.24定點整數褐捻。 Listing 1-7中的第一行計算類型中的字節(jié)數; 在定義ASBD的某些字段值時需要該編號掸茅,如清單所示。

接下來柠逞,仍然參考Listing 1-7倦蚪,聲明一個類型為AudioStreamBasicDescription的變量并將其字段初始化為0以確保沒有字段包含垃圾數據。 不要跳過這個調零步驟; 如果你這樣做边苹,你肯定會在稍后遇到麻煩。

現在定義ASBD字段值裁僧。 為mFormatID字段指定kAudioFormatLinearPCM个束。 音頻單元使用未壓縮的音頻數據,所以無論何時使用音頻單元聊疲,這都是正確的格式標識符茬底。

接下來,對于大多數音頻單元获洲,請為mFormatFlags字段指定kAudioFormatFlagsAudioUnitCanonical元標志阱表。 該標志在CoreAudio.framework / CoreAudioTypes.h中定義如下:

kAudioFormatFlagsAudioUnitCanonical = kAudioFormatFlagIsFloat |
                                kAudioFormatFlagsNativeEndian |
                                     kAudioFormatFlagIsPacked |
                             kAudioFormatFlagIsNonInterleaved

該元標記負責為類型為AudioUnitSampleType的線性PCM樣本值中的bits指定所有布局細節(jié)。

某些音頻單元采用非典型音頻數據格式贡珊,要求樣本采用不同的數據類型最爬,而mFormatFlags字段采用不同的標志集。例如门岔,3D混音器單元需要針對其音頻采樣值使用UInt16數據類型爱致,并要求將ASBDmFormatFlags字段設置為kAudioFormatFlagsCanonical。使用特定的音頻設備時寒随,請小心使用正確的數據格式和正確的格式標志糠悯。 (請參閱Using Specific Audio Units

繼續(xù)Listing 1-7,接下來的四個字段進一步指定了示例框架中的位的組織和含義妻往。根據您正在使用的音頻流的性質互艾,設置這些字段-mBytesPerPacketmBytesPerFrame讯泣,mFramesPerPacketmBitsPerChannel字段纫普。要了解每個這些字段的含義,請參閱AudioStreamBasicDescription結構的文檔判帮。您可以在示例代碼項目Audio Mixer(MixerHost)中看到填充ASBD的示例局嘁。

根據音頻流中的通道數量設置ASBDmChannelsPerFrame字段,1 為 mono audio, 2 為stereo晦墙,依此類推悦昵。

最后,根據您在應用中使用的采樣率設置mSampleRate字段晌畅。 Understanding Where and How to Set Stream Formats說明了避免采樣率轉換的重要性但指。 Configure Your Audio Session介紹了如何確保應用程序的采樣率與音頻硬件采樣率匹配。

您可以使用CAStreamBasicDescription.h文件(/ Developer / Extras / CoreAudio / PublicUtility /)中提供的C ++實用程序方法,而不是按字段指定ASBD字段棋凳。 特別是查看SetAUCanonicalSetCanonical C ++方法拦坠。 這些指定了三個因素推導ASBD字段值的正確方法:

  • 流是用于I / O(SetCanonical)還是用于音頻處理(SetAUCanonical)
  • 您希望流格式表示多少個通道
  • 您想要的流格式是交錯式還是非交錯式

無論您是否在項目中包含CAStreamBasicDescription.h文件以直接使用其方法,Apple建議您研究該文件以了解使用AudioStreamBasicDescription結構的正確方法剩岳。

有關如何解決與音頻數據流格式有關的問題的想法贞滨,請參閱 Troubleshooting Tips

后記

本篇主要講述了使用AudioStreamBasicDescription結構拍棕,感興趣的給個贊或者關注~~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末晓铆,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子绰播,更是在濱河造成了極大的恐慌骄噪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蠢箩,死亡現場離奇詭異链蕊,居然都是意外死亡,警方通過查閱死者的電腦和手機谬泌,發(fā)現死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門滔韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掌实,你說我怎么就攤上這事奏属。” “怎么了潮峦?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵囱皿,是天一觀的道長。 經常有香客問我忱嘹,道長嘱腥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任拘悦,我火速辦了婚禮齿兔,結果婚禮上,老公的妹妹穿的比我還像新娘础米。我一直安慰自己分苇,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布屁桑。 她就那樣靜靜地躺著医寿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蘑斧。 梳的紋絲不亂的頭發(fā)上靖秩,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天须眷,我揣著相機與錄音,去河邊找鬼沟突。 笑死花颗,一個胖子當著我的面吹牛,可吹牛的內容都是我干的惠拭。 我是一名探鬼主播扩劝,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼职辅!你這毒婦竟也來了今野?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤罐农,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后催什,有當地人在樹林里發(fā)現了一具尸體涵亏,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年蒲凶,在試婚紗的時候發(fā)現自己被綠了气筋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡旋圆,死狀恐怖宠默,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情灵巧,我是刑警寧澤搀矫,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站刻肄,受9級特大地震影響瓤球,放射性物質發(fā)生泄漏。R本人自食惡果不足惜敏弃,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一卦羡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麦到,春花似錦绿饵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粹淋,卻和暖如春要门,著一層夾襖步出監(jiān)牢的瞬間虏肾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工欢搜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留封豪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓炒瘟,卻偏偏與公主長得像吹埠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疮装,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容