![](/img/trans.png)
[英]kAudioUnitType_Output audio unit with a kAudioUnitSubType_VoiceProcessingIO clipping
[英]Apple's Voice Processing Audio Unit ( kAudioUnitSubType_VoiceProcessingIO ) broken on iOS 5.1
我正在為iPad寫一個VOIP應用程序(目前針對2和3)。
我最初使用音頻單元API編寫音頻代碼,並使用kAudioUnitSubtype_RemoteIO單元。 這很好用,但不出所料的回聲是一個問題。 我嘗試通過切換到使用kAudioUnitSubType_VoiceProcessingIO單元來使用內置回聲抑制。 這在iOS 6(iPad 3)上非常有效,但iOS 5.1(iPad 2)上的相同代碼會在麥克風輸入上產生白噪聲。
該文檔提到它應該在iOS 3.0及更高版本中可用
iOS版本似乎是這里的重要區別。 我嘗試在兩個iPhone 4S上運行應用程序,一個用iOS 6聽起來很好,一個用iOS 5.1聽起來像白噪聲。
我的ASBD看起來像這樣:
typedef int16_t sample_t;
#define AUDIO_BUFFER_SAMPLE_RATE 48000
#define FORMAT_FLAGS (kAudioFormatFlagsIsSignedInteger | kAudioFormatFlagsIsNonInterleaved)
#define CHANNELS_PER_FRAME 1
...
const size_t bytes_per_sample = sizeof(sample_t);
const int eight_bits_per_byte = 8;
AudioStreamBasicDescription streamFormat;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mSampleRate = AUDIO_BUFFER_SAMPLE_RATE;
streamFormat.mFormatFlags = FORMAT_FLAGS;
streamFormat.mChannelsPerFrame = CHANNELS_PER_FRAME;
streamFormat.mBytesPerFrame = bytes_per_sample * CHANNELS_PER_FRAME;
streamFormat.mBitsPerChannel = bytes_per_sample * eight_bits_per_byte;
streamFormat.mFramesPerPacket = 1;
streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame * streamFormat.mFramesPerPacket;
streamFormat.mReserved = 0;
有沒有人有過kAudioUnitSubType_VoiceProcessingIO可以在iOS 5.1上運行?
有誰知道這個IO的任何嚴肅的文件?
TL; DR將kAudioFormatFlagsIsPacked
添加到FORMAT_FLAGS
我通過一條錯綜復雜的路線發現了這一點。 這些似乎都沒有在任何地方得到很好的記錄,但我發現這篇SO帖子談論在Mac上使用IO。 提到的一件事是使用“FlagsCononical”。 我嘗試過設置:
#define FORMAT_FLAGS kAudioFormatFlagsAudioUnitCanonical
哪個不起作用,並且對AudioUnitInitialize的調用失敗,返回代碼為29759.我找不到任何關於這意味着什么的文檔,但是當我嘗試時:
#define FORMAT_FLAGS kAudioFormatFlagsCanonical
一切正常! 成功!
所述的定義kAudioFormatFlagsCanonical
在CoreAudioTypes.h如果構建為一個iPad(並且因此具有CA_PREFER_FIXED_POINT
定義為1
)為:
kAudioFormatFlagsCanonical = kAudioFormatFlagsIsSignedInteger
| kAudioFormatFlagsNativeEndian
| kAudioFormatFlagIsPacked;
將kAudioFormatFlagIsPacked
添加到我的原始代碼之后就可以了。 我添加了kAudioFormatFlagsNativeEndian
以獲得良好的衡量標准。 我刪除了kAudioFormatFlagsIsNonInterleaved
因為它無論如何kAudioFormatFlagsIsNonInterleaved
需要單通道音頻。 我留下的內容與kAudioFormatFlagsCanonical
完全相同。
所以我的設置在iPad 2(iOs 5.1)和iPad 3(iOS 6.0)上運行如下:
48000
kAudioFormatFlagsCanonical
int16_t
樣本 如果有人的話,我仍然熱衷於這個IO的文檔,當然如果這有助於你不要忘記upvote :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.