【发布时间】:2021-03-14 19:24:12
【问题描述】:
我发现自己需要模拟音频播放以欺骗操作系统控件和MPNowPlayingInfoCenter 认为正在播放音频。这是因为我正在构建一个播放多个音轨的播放器,在创建一个连续的“音频”音轨之间有暂停。我已经在应用程序本身内进行了所有设置,并且锁屏控件工作正常,但我面临的唯一问题是,当实际音频停止并且正在“播放”暂停时,锁屏信息中心会停止计时器,并且一旦另一个音轨开始播放,它只会继续显示正确的时间和整体状态。
以下是我从音频文件和暂停项构建的音轨示例:
let items: [AudioItem] = [
.audio("part-1.mp3"),
.pause(duration: 5), // value of type: TimeInterval
.audio("part-2.mp3"),
.pause(duration: 3),
... // the list goes on
]
然后在我的自定义播放器中,一旦 AVAudioPlayer 完成当前项目的工作,我会从数组中获取下一个并播放 .pause 和预定的 Timer 或另一个 .audio 和 AVAudioPlayer .
extension Player: AVAudioPlayerDelegate {
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
playNextItem()
}
}
这就是问题所在,一旦AVAudioPlayer 停止,“正在播放”信息中心也会自动停止,即使我一直保持新鲜nowPlayingInfo。然后当它碰到另一个.audio 项目时,它会正确恢复并显示当前时间等。
问题就在这里
如何欺骗MPNowPlayingInfoCenter 使其认为在我“播放”我的.pause 项目时正在播放音频?
我意识到我可能还不清楚我想要实现的目标,但如果需要,我很乐意分享更多见解。谢谢!
我目前正在考虑的一些解决方案:
A.保持 1 秒长的空音轨,只要需要暂停播放,就会循环播放。
B.以编程方式创建具有适当长度的空音轨并播放它,而不是使用 Timer 来跟踪暂停持续时间/进度,并完全依赖 AVAudioPlayer 来处理 .audio 和 .pause 项目。不过不确定这是否可行。
C.也许有一种方法可以告诉MPNowPlayingInfoCenter 音频继续播放而不需要使用AVAudioPlayer 但我不熟悉的一些API?
【问题讨论】:
标签: ios swift avaudioplayer avkit