尽管背景音频功能和会话类别,背景音频仍停止
Background audio stops despite background audio capability and session category
我正在使用 AudioKit 在我的应用程序中播放声音,我想让音频在后台继续播放。但是当应用程序进入后台或者当我进入 iPhone 的锁定屏幕时,应用程序的音频停止。
我已经在 XCode 中启用了背景音频功能(并确认适当的项目已添加到 Info.plist
)。
我已将会话类别设置为 .playback
,根据 AKSettings.swift 中的评论:
Audio is not silenced by silent switch and screen lock - audio is non mixable
所以我的理解是,如果我设置此类别并在我的 Info.plist
中启用背景音频,那么即使在锁定屏幕中也应该可以听到音频,但音频会静音(直到我解锁 phone 然后返回应用程序)。
我编写了一个非常简单的示例,除了应用委托(当然还有 AudioKit)之外不需要任何文件:
import UIKit
import AudioKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = UIViewController()
self.window?.makeKeyAndVisible()
// The important bits:
try? AKSettings.setSession(category: .playback)
AudioKit.output = AKWhiteNoise()
try? AudioKit.start()
return true
}
}
如您所见,我所做的只是设置会话类别并播放一些白噪声。当我启动应用程序时,我可以很好地听到白噪音,只有当 phone 被锁定或应用程序处于后台时,它才会静音。
另一件值得注意的事情:当我更换时:
try? AKSettings.setSession(category: .playback)
与:
try? AKSettings.setSession(category: .playAndRecord)
let s = AKStereoInput()
然后音频 继续在 background/locked 屏幕中播放,但随后闪烁的红色录音系统栏出现在顶部。所以大概应用程序保留在后台,因为 AKStereoInput
在初始化时分配了一个输入节点。
其他值得注意的事情:
- 我正在设备 (iPhone 6) 上进行测试,没有插入头phones 或其他硬件。
- 在此测试期间没有其他应用 运行。
我是不是遗漏了什么明显的东西?也许是一个设置或什么?或者我应该在 AudioKit github 上提出问题?
好的,我找到了一个解决方案,所以我将 post 放在这里以防有人遇到这个问题。
基本上,如果您想使用 .playback
作为您需要包括的类别:
AKSettings.playbackWhileMuted = true
默认为false
。查看 AKSettings.swift:267 看起来 playbackWhileMuted
在获取计算的会话类别时使用。所以请注意,您使用 AKSettings.setSession
设置的值可能不是 "computed" 的值,除非您记得设置适当的标志。
更新
我也刚刚尝试删除这一行:
try? AKSettings.setSession(category: .playback)
没有它也能正常工作。所以看起来简单地设置 playbackWhileMuted
就足够了。我想我可能误解了何时使用 setSession
。
我正在使用 AudioKit 在我的应用程序中播放声音,我想让音频在后台继续播放。但是当应用程序进入后台或者当我进入 iPhone 的锁定屏幕时,应用程序的音频停止。
我已经在 XCode 中启用了背景音频功能(并确认适当的项目已添加到 Info.plist
)。
我已将会话类别设置为 .playback
,根据 AKSettings.swift 中的评论:
Audio is not silenced by silent switch and screen lock - audio is non mixable
所以我的理解是,如果我设置此类别并在我的 Info.plist
中启用背景音频,那么即使在锁定屏幕中也应该可以听到音频,但音频会静音(直到我解锁 phone 然后返回应用程序)。
我编写了一个非常简单的示例,除了应用委托(当然还有 AudioKit)之外不需要任何文件:
import UIKit
import AudioKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = UIViewController()
self.window?.makeKeyAndVisible()
// The important bits:
try? AKSettings.setSession(category: .playback)
AudioKit.output = AKWhiteNoise()
try? AudioKit.start()
return true
}
}
如您所见,我所做的只是设置会话类别并播放一些白噪声。当我启动应用程序时,我可以很好地听到白噪音,只有当 phone 被锁定或应用程序处于后台时,它才会静音。
另一件值得注意的事情:当我更换时:
try? AKSettings.setSession(category: .playback)
与:
try? AKSettings.setSession(category: .playAndRecord)
let s = AKStereoInput()
然后音频 继续在 background/locked 屏幕中播放,但随后闪烁的红色录音系统栏出现在顶部。所以大概应用程序保留在后台,因为 AKStereoInput
在初始化时分配了一个输入节点。
其他值得注意的事情:
- 我正在设备 (iPhone 6) 上进行测试,没有插入头phones 或其他硬件。
- 在此测试期间没有其他应用 运行。
我是不是遗漏了什么明显的东西?也许是一个设置或什么?或者我应该在 AudioKit github 上提出问题?
好的,我找到了一个解决方案,所以我将 post 放在这里以防有人遇到这个问题。
基本上,如果您想使用 .playback
作为您需要包括的类别:
AKSettings.playbackWhileMuted = true
默认为false
。查看 AKSettings.swift:267 看起来 playbackWhileMuted
在获取计算的会话类别时使用。所以请注意,您使用 AKSettings.setSession
设置的值可能不是 "computed" 的值,除非您记得设置适当的标志。
更新
我也刚刚尝试删除这一行:
try? AKSettings.setSession(category: .playback)
没有它也能正常工作。所以看起来简单地设置 playbackWhileMuted
就足够了。我想我可能误解了何时使用 setSession
。