我正在尝试构建一个iOS应用程序来控制在单独的机器上运行的音乐播放器。我想使用MPNowPlayingInfoCenter来检查和控制这个播放器。据我所知,到目前为止,应用程序实际上必须输出音频才能工作(see also this answer)。
然而,例如,Spotify应用程序实际上能够在iOS设备上无需播放音频。如果您使用Spotify Connect在其他设备上播放音频,则MPNowPlayingInfoCenter仍会显示正确的歌曲并且控件正常运行。
这里有什么收获?一个人(概念上)必须做些什么来实现这个目标?我可以想到不断发出“静音”音频流,但这有点暴力。
答案 0 :(得分:0)
流式静音会起作用,但您不需要一直播放它。足够长的时间来发送您正在播放的信息。使用AVAudioPlayer
,我发现方法只会发送数据(假设播放器加载了1s无声音频文件):
player.play()
let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()
nowPlayingInfoCenter.nowPlayingInfo = [...]
player.stop()
我很惊讶这在单个事件循环中起作用。任何其他玩沉默的方法似乎都有效。同样,它可以非常简短(实际上我的测试中的上述代码甚至没有达到播放沉默的程度)。
我对其是否对其他人可靠地运作非常感兴趣,所以如果您对它有所了解,请发表评论。
我已经探索过Spotify应用程序了。如果这是他们正在使用的相同技术,我不是100%肯定。他们能够以某种方式与其他音频混合。因此,您可以在手机上播放本地音频,也播放Spotify Connect到其他设备,“正在播放”信息会互相踩踏。为了我的目的,这实际上会更好,但我无法复制它。我仍然必须使音频会话至少片刻不混合(如果你同时播放本地音频,你会得到~1s音频丢失)。我确实发现当我在本地播放其他音频时,Spotify应用程序对于播放我的Connect设备的可靠性不高。有时它会混淆并转换到想玩的地方。 (不可否认,这是一个奇怪的用例;我故意试图弄清楚它们是如何做到的。)
编辑:我不认为Spotify在这里做了什么特别的事。我认为他们只是播放无声音频。我认为同时播放两个流与AirPlay而不是Spotify(我无法通过蓝牙实现,只有AirPlay)。