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