簡體   English   中英

iOS 5.1上的Apple語音處理音頻單元(kAudioUnitSubType_VoiceProcessingIO)已損壞

[英]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
  • 1個頻道
  • kAudioFormatFlagsCanonical
  • int16_t樣本
  • 線性PCM

如果有人的話,我仍然熱衷於這個IO的文檔,當然如果這有助於你不要忘記upvote :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM