我的应用利用计时器来同时播放多个音频文件。
要赋予音频最大的优先级,AVAudioSession使用.playAndRecord
类别并允许播放和蓝牙。
这样设置计时器,并使其优先级高于应用程序内的用户界面(滚动时表视图会变得口吃,否则滚动时音频播放会停止),应用程序外的所有用户交互均不受影响:>
let timer = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { _ in
RunLoop.main.add(timer, forMode: RunLoop.Mode.common)
}
这可以确保即使设备被锁定,计时器也可以正常工作。
请不要告诉我计时器不够精确,就音频播放而言,它们似乎可以正常工作到几毫秒。
这在airplay(通常具有较小的延迟)和常见的蓝牙扬声器(它们似乎使用bluetoothA2DP)上正常工作。
但是,我发现,在我的大众汽车中使用蓝牙(使用低能耗的蓝牙LE)时,确实弄乱了计时器的计时。它们都以正确的顺序射击,但它们不再精确。
bluetoothLE是否会影响计时器,是否有办法避免这种情况?
顺便说一句,它似乎也在逐位压缩音频质量。
答案 0 :(得分:1)
结果是,将AVAudioSession
类别设置为.playback
可以完全解决问题。
先前的.playAndRecord
设置似乎允许处于锁定状态的更多可用资源,但对BluetoothLE连接却产生相反的作用。
现在,当音频路由更改时,我将仅在AVAudioSession
个类别之间切换。