在iOS 5.1上打破Apple的语音处理音频单元(kAudioUnitSubType_VoiceProcessingIO)

时间:2012-10-10 14:09:27

标签: ios audiounit

我正在为iPad编写一个VOIP应用程序(目前针对2& 3)。

我最初使用音频单元API编写音频代码,并使用kAudioUnitSubtype_RemoteIO单元。这很好用,但不出所料的回声是一个问题。我尝试通过切换到使用kAudioUnitSubType_VoiceProcessingIO单元来使用内置回声抑制。这在iOS 6(iPad 3)上非常有效,但iOS 5.1(iPad 2)上的相同代码会在麦克风输入上产生白噪声。

documentation只提到它应该可以在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的任何严肃文档?

1 个答案:

答案 0 :(得分:14)

TL; DR将kAudioFormatFlagsIsPacked添加到FORMAT_FLAGS

我通过一条复杂的路线发现了这一点。这些似乎都没有在任何地方得到很好的记录,但我偶然发现this SO post谈论在Mac上使用IO。提到的一件事是使用“FlagsCononical”。我尝试过设置:

#define FORMAT_FLAGS kAudioFormatFlagsAudioUnitCanonical

哪个不起作用,并且对AudioUnitInitialize的调用失败,返回代码为29759.我找不到任何关于这意味着什么的文档,但是当我尝试时:

#define FORMAT_FLAGS kAudioFormatFlagsCanonical
一切顺利!成功了!

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

kAudioFormatFlagsCanonical = kAudioFormatFlagsIsSignedInteger
                           | kAudioFormatFlagsNativeEndian
                           | kAudioFormatFlagIsPacked;

kAudioFormatFlagIsPacked添加到我的原始代码后,它就有效了。我添加了kAudioFormatFlagsNativeEndian以获得良好的衡量标准。我删除了kAudioFormatFlagsIsNonInterleaved,因为无论如何都不需要单通道音频。我留下的内容与kAudioFormatFlagsCanonical相同。

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

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

如果有人的话,我仍然热衷于这个IO的文档,当然如果这有助于你不要忘记upvote:)