【问题标题】:iOS background audio stops when screen is locked屏幕锁定时iOS背景音频停止
【发布时间】:2012-06-20 13:12:24
【问题描述】:

我正在尝试让我的音频应用在后台播放。到目前为止,我在 info.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 上的所有教程/文档/问题的答案似乎都表明,当您让背景音频工作时,在屏幕关闭时保持音频运行会自动发生。有人对我有提示吗?提前非常感谢! 弗里茨

【问题讨论】:

  • 我忘了说:我正在使用 AudioQueues 来生成音频输出流。屏幕关闭时调用音频队列回调,但耳机听不到声音。这可能表明存在一些音频路由问题。但是,我的路由更改回调从未被调用。
  • 好的,问题解决了...事实证明,如果在屏幕关闭的情况下运行,音频缓冲区必须足够大。我不知道这是否适用于所有应用程序,但我的应用程序需要至少 2048 个样本的缓冲区大小。有 1024 个样本,它刚刚停止工作。
  • 如果你能够让它工作,你能添加你的解决方案作为答案吗?谢谢。
  • Fritz,你能指定你在哪里设置音频缓冲区大小吗?我遇到了同样的问题,当我查看我的渲染回调时,缓冲区限制为 1024 个样本。但我不知道在哪里可以增加这个值。

标签: ios audio background multitasking


【解决方案1】:

这篇文章解释了这个问题:

Technical Q&A QA1606 Audio Unit Processing Graph - Ensuring audio playback continues when screen is locked

基本上,您只需确保将所有 AudioUnit 设置为支持 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));

【讨论】:

  • 知道如何将其应用于 AVAudioEngine 吗?
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多