AudioOutputUnitStart非常慢

我有一个播放单声道audio事件的代码(在各种频率下发出短促的哔声)。 我创build一个AudioOutputUnit,停下来,每当我需要播放audio。 我开始吧 当我玩了所需的时间,我停下来。

听起来很简单。

但是,AudioOutputUnitStart通常需要180ms才能在我的iPhone 4S(iOS 5.1)上返回,这太方便了。

这里是AudioOutputUnit的创build/初始化

void createAOU() { m_init = false; // find the default playback output unit AudioComponentDescription defaultOutputDescription; defaultOutputDescription.componentType = kAudioUnitType_Output; defaultOutputDescription.componentSubType = kAudioUnitSubType_RemoteIO; defaultOutputDescription.componentManufacturer = kAudioUnitManufacturer_Apple; defaultOutputDescription.componentFlags = 0; defaultOutputDescription.componentFlagsMask = 0; // Get the default playback output unit AudioComponent defaultOutput = AudioComponentFindNext(NULL, &defaultOutputDescription); if (defaultOutput == NULL) return; OSErr err = AudioComponentInstanceNew(defaultOutput, &m_toneUnit); if (err != noErr) return; // single channel, floating point, linear PCM AudioStreamBasicDescription streamFormat; streamFormat.mSampleRate = m_framerate; streamFormat.mFormatID = kAudioFormatLinearPCM; streamFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kLinearPCMFormatFlagIsPacked; streamFormat.mBytesPerPacket = sizeof(float); streamFormat.mFramesPerPacket = 1; streamFormat.mBytesPerFrame = sizeof(float); streamFormat.mChannelsPerFrame = 1; streamFormat.mBitsPerChannel = sizeof(float) * 8; err = AudioUnitSetProperty (m_toneUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamFormat, sizeof(AudioStreamBasicDescription)); if (err != noErr) return; // Attach callback to default output AURenderCallbackStruct input; input.inputProc = RenderTone; input.inputProcRefCon = this; err = AudioUnitSetProperty(m_toneUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &input, sizeof(input)); if (err != noErr) return; float aBufferLength = 0.001; // In seconds AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(aBufferLength), &aBufferLength); err = AudioUnitInitialize(m_toneUnit); if (err != noErr) return; reset(); m_init = true; } 

要开始它,我只需要打电话:

 OSErr err = AudioOutputUnitStart(m_toneUnit); 

完成后:

 OSErr err = AudioOutputUnitStop(m_toneUnit); 

我尝试了各种各样的东西:使kAudioSessionProperty_PreferredHardwareIOBufferDuration属性为一个非常小的值(如5ms)降低帧率(尝试48kHz,44.1kHz,8kHz)

无论我做什么…第一次audiounit开始,AudioOutputUnitStart只在160-180ms后返回。 如果我立即停下来,那么它只需要5米左右,这是可以接受的。

在我的应用程序中的延迟是相当重要的,180毫秒是绝对不能接受的。

有什么build议么? 我见过几个人提出类似的问题,但他们通常从来没有得到答案。

我希望这个时候事情会不同:)

处理audio单元启动延迟的方法是在需要的时间之前启动audio单元,而不是停止。 相反,只需configuration短暂缓冲区的audio会话,然后用静音填充audio单元呈现callback缓冲区,直到需要填充所需的声音为止。 然后,在你的声音之后,回到填充缓冲区,而不是停止。