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

hmtdttj4  于 2023-05-30  发布在  iOS
关注(0)|答案(1)|浏览(185)

我正在为iPad写一个VOIP应用程序(目前针对2&3)。
我最初使用音频单元API编写音频代码,并使用kAudioUnitSubtype_RemoteIO单元。这很好用,但毫无疑问echo是个问题。我尝试通过切换到使用kAudioUnitSubType_VoiceProcessingIO单元来使用内置的回声抑制。这在iOS 6(iPad 3)上运行得很好,但在iOS 5.1(iPad 2)上的相同代码会在麦克风输入上产生白色噪声。
文档只是提到它应该在iOS3.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的任何重要文档吗?

ia2d9nvy

ia2d9nvy1#

TL;DR将kAudioFormatFlagsIsPacked添加到FORMAT_FLAGS
我是通过一条有点曲折的路线发现这一点的。所有这些似乎都没有很好的文档记录,但我偶然看到this SO post谈论在Mac上使用IO。其中提到的一件事是使用“FlagsCononical”。我试着设置:

#define FORMAT_FLAGS kAudioFormatFlagsAudioUnitCanonical

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

#define FORMAT_FLAGS kAudioFormatFlagsCanonical

一切正常!成功了!
如果您正在为iPad构建,则CoreAudioTypes.h中kAudioFormatFlagsCanonical的定义(因此将CA_PREFER_FIXED_POINT定义为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的文档,如果有人有任何。

相关问题