使用kAudioUnitSubType_VoiceProcessingIO音频IO单元子类型的音频图初始化错误

Chu*_*kai 6 audio voip core-audio ios

我正在开发一个需要声学回声消除的iOS项目,因此kAudioUnitSubType_VoiceProcessingIO子类型似乎是一个不错的选择.以下是我的音频单元说明

//io unit description 
AudioComponentDescription ioUnitDescription;
ioUnitDescription.componentType = kAudioUnitType_Output;
ioUnitDescription.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
ioUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
ioUnitDescription.componentFlags = 0;
ioUnitDescription.componentFlagsMask = 0;
Run Code Online (Sandbox Code Playgroud)

根据我对RemoteIO子类型的经验,我启用了输入元素:

UInt32  enable = 1;
AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enable, sizeof(enable));
Run Code Online (Sandbox Code Playgroud)

但是,初始化音频图时出错.如果VoiceProcessingIO被RemoteIO取代,则相同的音频图表可以正常工作.

RemoteIO和VoiceProcessingIO之间有什么区别需要特别注意吗?

谢谢,Chuankai

小智 0

根据我的经验,VoiceProcessingIO 音频单元在缓冲区大小和采样率方面更加挑剔。尝试低于 32000 Hz 的采样率(也许从 8000 Hz 开始,然后向上)和相当大的缓冲区大小(例如 2048 个样本左右)。这没有记录。一旦我有机会提交 rdar 号码,就会来。

我在设置过程中使用以下格式:

    size_t bytesPerSample = sizeof(AudioSampleType);
    AudioStreamBasicDescription canonicalFormat;
    canonicalFormat.mSampleRate         = self.samplerate;
    canonicalFormat.mFormatID           = kAudioFormatLinearPCM;
    canonicalFormat.mFormatFlags        = kAudioFormatFlagsCanonical;
    canonicalFormat.mFramesPerPacket    = 1;
    canonicalFormat.mChannelsPerFrame   = 1;
    canonicalFormat.mBitsPerChannel     = 8 * bytesPerSample;
    canonicalFormat.mBytesPerPacket     = bytesPerSample;
    canonicalFormat.mBytesPerFrame      = bytesPerSample;
Run Code Online (Sandbox Code Playgroud)