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