我正在编写一个 iPhone 应用程序,它使用 I/O 音频单元同时录制和播放音频苹果的建议 http://developer.apple.com/iphone/library/codinghowtos/AudioAndVideo/index.html#PLAYBACK-RECORD_AND_PLAY_BACK_AUDIO_AT_THE_SAME_TIME.
我想在播放之前对录制的音频应用一些声音效果(混响等)。为了使这些效果正常工作,我需要样本是浮点数,而不是整数。看来这应该是可能的,通过创建一个AudioStreamBasicDescription
with kAudioFormatFlagIsFloat
set on mFormatFlags
。这就是我的代码的样子:
AudioStreamBasicDescription streamDescription;
streamDescription.mSampleRate = 44100.0;
streamDescription.mFormatID = kAudioFormatLinearPCM;
streamDescription.mFormatFlags = kAudioFormatFlagIsFloat;
streamDescription.mBitsPerChannel = 32;
streamDescription.mBytesPerFrame = 4;
streamDescription.mBytesPerPacket = 4;
streamDescription.mChannelsPerFrame = 1;
streamDescription.mFramesPerPacket = 1;
streamDescription.mReserved = 0;
OSStatus status;
status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamDescription, sizeof(streamDescription));
if (status != noErr)
fprintf(stderr, "AudioUnitSetProperty (kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input) returned status %ld\n", status);
status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &streamDescription, sizeof(streamDescription));
if (status != noErr)
fprintf(stderr, "AudioUnitSetProperty (kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output) returned status %ld\n", status);
然而,当我运行这个(在运行 iPhoneOS 3.1.3 的 iPhone 3GS 上)时,我得到:
AudioUnitSetProperty (kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input) returned error -10868
AudioUnitSetProperty (kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output) returned error -10868
(-10868 的值是kAudioUnitErr_FormatNotSupported
)
我在苹果的文档中没有找到任何有价值的东西,除了推荐 http://developer.apple.com/iphone/library/codinghowtos/AudioAndVideo/index.html#PLAYBACK-CHOOSE_THE_BEST_AUDIO_FORMATS_IN_IPHONE_OS坚持 16 位小端整数。但是,那奥里奥触摸 http://developer.apple.com/iphone/library/samplecode/aurioTouch/Introduction/Intro.html示例项目至少包含一些相关的支持代码kAudioFormatFlagIsFloat
.
那么,我的流描述是否不正确,或者是kAudioFormatFlagIsFloat
iPhoneOS 根本不支持?