苹果公司的语音处理audio单元(kAudioUnitSubType_VoiceProcessingIO)在iOS 5.1上打破

我正在为iPad编写一个VOIP应用程序(目前以2和3为目标)。

我最初使用Audio Unit API和kAudioUnitSubtype_RemoteIO单元编写audio代码。 这工作得很好,但不出所料,回声是一个问题。 我试图通过切换到使用kAudioUnitSubType_VoiceProcessingIO单位来使用内置的回声抑制。 这在iOS 6(iPad 3)上运行得非常好,但iOS 5.1(iPad 2)上的相同代码会在麦克风input上产生白噪声。

该文件只是提到它应该在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

我通过一些复杂的路线发现了这一点。 这似乎没有任何地方很好的certificate,但我遇到这个SO后讨论在Mac上使用IO。 其中一个提到的是使用“FlagsCononical”。 我试过设置:

 #define FORMAT_FLAGS kAudioFormatFlagsAudioUnitCanonical 

没有工作,并调用AudioUnitInitialize失败,返回码为29759.我找不到任何有关这意味着什么文件,但是当我尝试:

 #define FORMAT_FLAGS kAudioFormatFlagsCanonical 

一切正常! 成功!

CoreAudioTypes.h中kAudioFormatFlagsCanonical的定义,如果您正在为iPad构build(因此将CA_PREFER_FIXED_POINT定义为1 ):

 kAudioFormatFlagsCanonical = kAudioFormatFlagsIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; 

kAudioFormatFlagIsPacked添加到我的原始代码后,它工作。 我添加了kAudioFormatFlagsNativeEndian以获得更好的效果。 我删除了kAudioFormatFlagsIsNonInterleaved因为它对于单声道audio是不必要的。 我留下的是与kAudioFormatFlagsCanonical相同的。

所以我在iPad 2(iOs 5.1)和iPad 3(iOS 6.0)上的设置如下:

  • 采样率为48000
  • 1个频道
  • kAudioFormatFlagsCanonical
  • int16_t样本
  • 线性PCM

我仍然热衷于这个IO的文档,如果任何人有任何,当然,如果这有助于你不忘记upvote 🙂