【问题标题】:How can you play music from the iPod app while still receiving remote control events in your app?如何在您的应用程序中接收远程控制事件的同时从 iPod 应用程序播放音乐?
【发布时间】:2011-03-12 14:51:06
【问题描述】:

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

这是我目前所知道的......

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

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

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

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

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

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

任何关于如何解决这个问题的建议都将受到欢迎。有创意或完全疯狂。没关系,只要它有效。

有人吗?任何人?布勒?比勒?

M

【问题讨论】:

    标签: iphone ios4 remote-control


    【解决方案1】:

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

    如果您只对音乐远程控制事件感兴趣并且仍然希望能够播放 audible.com 文件...

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 是的,但正如我所说,不能用它来播放 Audible 文件,这使我们的整个项目脱轨。哦,好吧!
      【解决方案3】:

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

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

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

      大功告成!

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

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

      【讨论】:

      • Marquel,知道为什么 Audible.com 文件会这样损坏吗?
      • 我的猜测是它们并没有损坏,但这是 Audible 制作的方式,因此您无法编写“有声图书翻录”应用程序,但这纯粹是猜测。我从来没有找到官方的原因。也很臭,因为它杀死了我的产品。如果找到答案,请告诉我。 (另外,如果你喜欢这个问题,请投票。)
      • 哇。感谢这个非常详细的解释写得很好。并且组织得很漂亮。我正在休闲音乐游戏中播放用户的音频文件,以响应他们从提示中做出的选择。我也使用[MPMusicPlayerController iPodMusicPlayer] 播放音频文件,但意识到那是多么的俗气。我试图弄清楚如何为applicationMusicPlayer 启用后台,但无法弄清楚。这提供了我需要的 100% 的答案。你刚刚救了我一夜。非常感谢你难以置信的回答。你得到了很多支持:)
      • @MarqueIV "这让您可以在后台播放 iPod 库中的项目,但仍然可以获取远程事件" 您是否像注册 AVAudioPlayer 一样注册远程事件?
      • 已经有一段时间了,但我相信是的。您只需启动不同的播放器(AVPlayer,而不是 AVAudioPlayer)。但是,请确保正确设置类别。如果你不这样做,那会咬你的。
      【解决方案4】:

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

      【讨论】:

      • 我知道。同样,这不是问题。应用程序播放的唯一时间是当您将 MPMusicPlayer 与 ipodMusicPlayer 一起使用时。 applicationMusicPlayer 是您应用中的一个实例。但即使是这种情况,这仍然无法解释为什么当您使用绝对与应用程序无关的 AVAudioPlayer 时,您不能使用文档明确声明的 MPMediaItem 中的资产 URL目的。同样,我试图让用户播放库中的文件。它不必与 iPod 应用程序一起使用。
      • 看来有可能!看看这个...engadget.com/2010/07/08/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 2016-03-11
      • 2016-05-03
      • 1970-01-01
      相关资源
      最近更新 更多