版本記錄
版本號 | 時間 |
---|---|
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的布局具有含義慕蔚,因此像Float32
或UInt16
這樣的數據類型不夠表達。 在本節(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
數據類型爱致,并要求將ASBD
的mFormatFlags
字段設置為kAudioFormatFlagsCanonical
。使用特定的音頻設備時寒随,請小心使用正確的數據格式和正確的格式標志糠悯。 (請參閱Using Specific Audio Units
)
繼續(xù)Listing 1-7
,接下來的四個字段進一步指定了示例框架中的位的組織和含義妻往。根據您正在使用的音頻流的性質互艾,設置這些字段-mBytesPerPacket
,mBytesPerFrame
讯泣,mFramesPerPacket
和mBitsPerChannel
字段纫普。要了解每個這些字段的含義,請參閱AudioStreamBasicDescription
結構的文檔判帮。您可以在示例代碼項目Audio Mixer(MixerHost)
中看到填充ASBD
的示例局嘁。
根據音頻流中的通道數量設置ASBD
的mChannelsPerFrame
字段,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
字段棋凳。 特別是查看SetAUCanonical
和SetCanonical C ++
方法拦坠。 這些指定了三個因素推導ASBD字段值的正確方法:
- 流是用于
I / O(SetCanonical)
還是用于音頻處理(SetAUCanonical)
- 您希望流格式表示多少個通道
- 您想要的流格式是交錯式還是非交錯式
無論您是否在項目中包含CAStreamBasicDescription.h
文件以直接使用其方法,Apple建議您研究該文件以了解使用AudioStreamBasicDescription
結構的正確方法剩岳。
有關如何解決與音頻數據流格式有關的問題的想法贞滨,請參閱 Troubleshooting Tips
。
后記
本篇主要講述了使用AudioStreamBasicDescription結構拍棕,感興趣的給個贊或者關注~~~~