9

好的,我试图让用户从他们的 iPod 库中选择歌曲来收听,但我仍然想在我的应用程序中接收远程控制通知(耳机、锁屏 OSD 等),以便我可以做一些额外的事情。到目前为止,我可以播放 iPod 音乐或耳机事件,但不能同时播放两者。

这是我到目前为止所知道的......

  1. 如果您使用 MPMusicPlayer,您可以轻松地以编程方式访问整个音乐库。但是,无论您使用的是 applicationMusicPlayer 还是 ipodMusicPlayer,它(而不是您的应用程序)都会接收远程通知。

  2. 如果您使用 AVAudioPlayer(Apple 推荐的应用程序中大多数声音的播放器),您可以轻松获得远程通知,但它本身无法访问 iPod 库。

  3. AVAudioPlayer 可以使用资产 URL 进行初始化,并且 iPod 库(MPMediaItem 类型)中的曲目确实有一个 URL 属性,该属性返回一个 NSURL 实例,文档明确说明它可以与 AVAsset 对象一起使用,但是当您尝试使用它初始化 AVAudioPlayer 时NSURL,它失败了。(我在 iPod 中使用了“正在播放”的曲目,它是一个 MP3,它确实返回了一个有效的 NSURL 对象,但初始化失败。更糟糕的是,当它是一个 Audible.com 文件时,NSURL 属性完全返回 nil。)

  4. 如果您尝试使用 AVAudioPlayer 的实例来获取远程事件(例如,使用空白声音文件),然后同时使用 MPMusicPlayer 类来播放 iPod 音乐,则您可以远程控制访问,直到您真正开始 iPod 播放,此时您会丢失因为您的音频会话被停用并且系统音频会话变得活跃。

  5. 如果您尝试与 #4 相同的方法,但您将音频会话的类别设置为可混合变体,您的会话不会被停用,但是一旦 iPod 开始播放,您仍然会失去远程控制功能。

简而言之,无论何时播放 MPMusicPlayer,我似乎都无法获得远程事件,而且除了使用 MPMusicPlayer 之外,我不知道有任何其他方法可以播放 iPod 库中的内容。

欢迎任何有关如何解决此问题的建议。有创意或完全疯狂。不要在意,只要它有效。

任何人?任何人?布勒?布勒?

4

4 回答 4

16

哈!解决了!我知道这是可能的!(感谢Async-games.com 的支持!)

以下是如何在您的应用程序中播放 iPod 音乐、使用后台支持以及让您的应用程序接收远程控制通知。

您必须使用 AVPlayer(但不是 AVAudioPlayer。不知道为什么会这样!)使用您从库选择器(或 MPMusicPlayerController 中的当前项目或其他任何地方)获得的 MPMediaItem 的资产 URL 进行初始化,然后将音频会话的类别设置为 Playable (不要启用混合覆盖,否则您将丢失远程事件!)并将适当的键添加到您的 info.plist 文件中,告诉操作系统您的应用程序想要支持背景音频。

完成并完成!

这使您可以在后台播放 iPod 库中的项目(出于某种原因,Audible.com 文件除外!),并且仍然可以获取远程事件。当然,因为这是您的音频播放器,它与 iPod 应用程序是分开的,并且会中断 iPod 应用程序,您必须做更多的工作,但这些都是休息时间!

该死的……我只是希望它能与 Audible.com 文件一起使用。(对于那些感兴趣的人,它没有的原因是声音文件的资产 URL 返回 nil。臭!但是你能做什么!)

于 2010-07-09T06:44:24.037 回答
2

对于 OP,这可能不再有任何用处,但是对于通过谷歌搜索找到此页面的人可能有用,我无论如何都会发布它。

另一种(但相当丑陋)的方法,如果您只对音乐远程控制事件感兴趣并且仍然希望能够播放 audible.com 文件......

只需继续使用 MPMusicPlayer 并跟踪它的通知(现在正在播放和状态已更改)。为了在后台继续接收这些通知,您可以执行各个地方描述的“后台线程魔术”来防止您的应用程序被挂起。您不会直接接收遥控器(因为 iPod 播放器正在接收它们),但通过跟踪“正在播放”中的更改,您可以推断 ControlPreviousTrack 和 ControlNextTrack 事件,并通过跟踪回放状态,您可以推断 TogglePlayPause命令。

不利的一面是,您的应用程序将无缘无故地一直运行(尽管公平地说,如果 iOS 编程正确,后台线程什么也不做应该几乎不消耗电池)。

另一种选择:使用 MPMoviePlayer?我已经检查过它在后台运行良好,并且也应该接收远程控制事件。它可以原生播放 MPMediaItem,所以希望 Audible.com 文件也是如此......

于 2012-01-18T11:41:39.377 回答
0

没有办法解决这个问题。如果用户的 iPod 应用程序正在播放 iPod 选择,那么所有远程事件都将转到 iPod,而不是您的应用程序。

于 2010-07-07T03:46:57.190 回答
0

我注意到 MPMediaItemPropertyAssetURL 的一个想法是,虽然返回的对象在 NSURL 中,但 absoluteString 是这样的:

ipod-library://item/item.mp3?id=580807975475997900

这不是 AVAudioPlayer 想要的。AVAudioPlayer 想要的是从具有有效文件路径的文件创建的 NSURL 对象。

而且我不知道如何从 MPMediaItem 获取文件路径。所以我想如果你想在不使用 MPMusicPlayer 的情况下播放 iPod 曲目,也许 AVPlayer 是你要走的路。

于 2010-11-15T12:00:32.930 回答