屏幕锁定时iOS背景音频停止

brtdzjyr  于 2023-05-02  发布在  iOS
关注(0)|答案(2)|浏览(187)

我想让我的音频应用在后台播放。到目前为止,我在信息中的“所需背景模式”中添加了“应用程序播放音频”。plist和下面的代码只是在启动我的声音发生器:

AudioSessionInitialize(NULL, kCFRunLoopDefaultMode, &interruptionListener, sgD);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, &routeChangeListener, sgD);

// select "Playback" audio session category
NSError *setCategoryError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];

OSStatus propertySetError = 0;
UInt32 category = kAudioSessionCategory_MediaPlayback; 
propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_AudioCategory, sizeof (category), &category );

AudioSessionSetActive(true);

然而,只有当我切换到另一个应用程序或iPod的主屏幕时,这才有效。当我关闭屏幕时,它也关闭了我的音频输出,这绝对不是我想要的。但是,所有关于stackoverflow的教程/文档/问题答案似乎都表明,当你让背景音频工作时,在屏幕关闭时保持音频运行会自动出现。有人能给我点提示吗?非常感谢!弗里茨

wqsoz72f

wqsoz72f1#

这篇文章解释了这个问题:
Technical Q&A QA1606 Audio Unit Processing Graph - Ensuring audio playback continues when screen is locked
基本上,您只需要确保将所有AudioUnits设置为支持4096切片:

// set the mixer unit to handle 4096 samples per slice since we want to keep rendering during screen lock
UInt32 maxFPS = 4096;
AudioUnitSetProperty(
    mMixer,
    kAudioUnitProperty_MaximumFramesPerSlice,
    kAudioUnitScope_Global,
    0,
    &maxFPS,
    sizeof(maxFPS));
xdnvmnnf

xdnvmnnf2#

老问题,但我有同样的问题,我找不到其他相关的问题或答案。无论我如何配置我的AudioQueue回调,我都不能让它在没有音频丢失的情况下始终进入后台。如果我把缓冲区设置得很大,那么它几乎可以一直工作,但是使用巨大的缓冲区,UI的音频响应延迟就会过长。
我发现的唯一有效的解决方案是将我的回调从AudioQueue切换到Audio Units(RemoteIO),与之前的解决方案不同,我没有发现有必要将Audio Unit缓冲区大小设置为4096。当应用程序进入后台时,如果它附加到调试器,我仍然会得到一个非常小的dropout,但是当应用程序在没有调试器的情况下正常运行时,我不会得到任何dropout。

相关问题