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

时间:2011-04-12 12:52:19

标签: ios audio core-audio voip

我正在开发一个需要声学回声消除的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;

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

UInt32  enable = 1;
AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enable, sizeof(enable));

但是,我在初始化音频图时遇到错误。如果VoiceProcessingIO被RemoteIO取代,则相同的音频图表效果很好。

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

谢谢, Chuankai

1 个答案:

答案 0 :(得分:0)

根据我的经验,VoiceProcessingIO音频单元在缓冲区大小和采样率方面更加挑剔。尝试低于32000 Hz的采样率(可能从8000 Hz开始向上)和相当大的缓冲区大小(比如2048个样本左右)。这没有记录。一旦我有机会提交一个数字,就会出现这个数字。

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

    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;