iOS AudioUnit回调在进入后台模式时出现打嗝

iOS AudioUnit回调在进入后台模式时出现打嗝,ios,audiounit,Ios,Audiounit,我正在编写一个在iOS设备上播放RTP音频流的应用程序。它在前景模式和背景模式下都能很好地工作,但是当切换到背景模式时,它会被卡住大约一秒钟。为了研究这个问题,我发现在转换到后台模式的过程中,AudioUnit回调函数调用之间的时间从5毫秒上升到100毫秒,而转换完成后,时间又下降到5毫秒。 音频初始化代码: -(BOOL)initOutput { OSStatus status; AudioStreamBasicDescription audioFormat; Au

我正在编写一个在iOS设备上播放RTP音频流的应用程序。它在前景模式和背景模式下都能很好地工作,但是当切换到背景模式时,它会被卡住大约一秒钟。为了研究这个问题,我发现在转换到后台模式的过程中,AudioUnit回调函数调用之间的时间从5毫秒上升到100毫秒,而转换完成后,时间又下降到5毫秒。 音频初始化代码:

-(BOOL)initOutput {
    OSStatus status;

    AudioStreamBasicDescription audioFormat;

    AudioComponentDescription desc;
    desc.componentType = kAudioUnitType_Output;
    desc.componentSubType = kAudioUnitSubType_RemoteIO;
    desc.componentFlags = 0;
    desc.componentFlagsMask = 0;
    desc.componentManufacturer = kAudioUnitManufacturer_Apple;

    AudioComponent component = AudioComponentFindNext(NULL, &desc);

    status = AudioComponentInstanceNew(component, &audioUnit);
    if (status != 0) {
        NSLog(@"Error creating audio component instance");
        return false;
    }

    audioFormat.mSampleRate         = samplerate; // 48000
    audioFormat.mFormatID           = kAudioFormatLinearPCM;
    audioFormat.mFormatFlags        = kAudioFormatFlagsCanonical;
    audioFormat.mFramesPerPacket    = 1;
    audioFormat.mChannelsPerFrame   = channels; // 2
    audioFormat.mBitsPerChannel     = 16;
    audioFormat.mBytesPerPacket     = channels * 2;
    audioFormat.mBytesPerFrame      = audioFormat.mBytesPerPacket;
    audioFormat.mReserved           = 0;

    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &audioFormat, sizeof(audioFormat));
    if (status != 0) {
        NSLog(@"Error setting kAudioUnitProperty_StreamFormat %i", status);
        return false;
    }

    AURenderCallbackStruct callbackStruct;
    callbackStruct.inputProc = playbackCallback;
    callbackStruct.inputProcRefCon = (__bridge void*)self;
    status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callbackStruct, sizeof(callbackStruct));
    if (status != 0) {
        NSLog(@"Error setting kAudioUnitProperty_SetRenderCallback");
        return false;
    }

    status = AudioUnitInitialize(audioUnit);
    if (status != 0) {
        NSLog(@"Error initializing unit");
        return false;
    }

    return true;
}
AVAudioSession类别是AVAudioSessionCategoryPlayback。
CPU负载永远不会超过10%。我做错了什么,以及如何修复它?

您是否在附加调试程序和未附加调试程序的情况下进行了双重检查?您可能会得到不同的结果,大多数情况下没有调试器,只是NSLog时间戳我不擅长音频,但是音频播放严重依赖于RunLoop。我将尝试使用
后台执行
(应用程序完成其工作的额外时间)并在主线程上显式运行
CFRunLoopRunInMode
,大约一秒钟。您是否在附加了调试器和未附加调试器的情况下进行了双重检查?您可能会得到不同的结果,大多数情况下没有调试器,只是NSLog时间戳我不擅长音频,但是音频播放严重依赖于RunLoop。我将尝试使用
后台执行
(应用程序完成其工作的额外时间)并在主线程上显式运行
CFRunLoopRunInMode
,大约一秒钟。