代码之家  ›  专栏  ›  技术社区  ›  Mark A. Donohoe

在应用程序中接收遥控事件的同时,如何播放iPod应用程序中的音乐?

  •  9
  • Mark A. Donohoe  · 技术社区  · 14 年前

    好的,我正在尝试让用户从他们的iPod库中选择要听的歌曲,但我仍然希望在我的应用程序中接收遥控器通知(耳机、锁定屏幕OSD等),这样我可以做一些额外的事情。到目前为止,我既可以播放iPod音乐,也可以播放耳机事件,但不能同时播放两者。

    这就是我目前所知道的……

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

    2. 如果你使用avaudioplayer(苹果推荐的播放器可以播放你的应用程序中的大多数声音),你可以很容易地得到远程通知,但是它本身就不能访问iPod库。

    3. avaudioplayer可以用资源url初始化,并且iPod库(类型mpmediaitem)中的曲目确实具有url属性,该属性返回一个nsurl实例,文档明确指出该实例用于avasset对象,但当您尝试用该nsurl初始化avaudioplayer时,它失败。(我在ipod中使用了“now playing”(正在播放)曲目,这是一个MP3,它确实返回了一个有效的nsurl对象,但初始化失败。更糟糕的是,当它是audible.com文件时,nsurl属性flat out返回nil。)

    4. 如果您尝试使用avaudioplayer的实例来获取远程事件(例如,使用空白声音文件),然后同时使用mpmusicPlayer类来播放iPod音乐,则您可以远程控制,直到您实际开始iPod播放,此时,由于音频会话被停用,系统音频会话变为ACT,您将丢失iPod播放。伊夫。

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

    简言之,每当mpmusicplayer播放时,我似乎无法获得远程事件,除了使用mpmusicplayer之外,我不知道其他任何方法来播放iPod库中的内容。

    任何 欢迎就如何解决这一问题提出建议。有创意的或完全疯狂的。只要有用就不要在意。

    有人吗?有人吗?Bueller?Bueller?

    4 回复  |  直到 12 年前
        1
  •  16
  •   Mark A. Donohoe    14 年前

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

    下面介绍如何在应用程序中播放iPod音乐,以及后台支持和应用程序接收遥控器通知。

    你必须使用avplayer(而不是avaudioplayer)。不知道为什么!)使用从库选取器(或mpmusicPlayerController中的当前项或任何位置)获得的mpmediaitem的资源url初始化,然后将音频会话的类别设置为可播放(不要启用混合覆盖,否则将丢失远程事件!)并在info.plist文件中添加相应的键,告诉操作系统您的应用程序希望支持后台音频。

    完成和完成!

    这允许您播放iPod库中的项目(出于某种原因,audible.com文件除外!)在后台,仍然获取远程事件。既然这是你的音频播放器,它是分开的,并将中断iPod应用程序,你必须做更多的工作,但那些是休息!

    该死的…我只是希望它能和audible.com文件一起工作。(对于感兴趣的人,原因是声音文件的资产URL返回零。臭!但你能做什么!)

        2
  •  2
  •   Blaise    13 年前

    这可能对这个操作不再有任何用处,但因为它可能是人们通过谷歌搜索找到这个页面,我无论如何都会发布它。

    如果您只对音乐遥控器事件感兴趣,并且仍然希望能够播放audible.com文件,那么您可以使用另一种(但相当难看)方法…

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

    缺点是,你的应用程序将一直运行,没有任何好的理由(不过,公平地说,如果iOS编程正确,后台线程什么都不做应该消耗几乎没有电池)。

    另一种选择:使用mpmovieplayer?我已经检查过它在后台工作正常,并且应该接收远程控制事件。它可以本地播放mpmediaitem,所以希望也能播放audible.com文件…

        3
  •  0
  •   coneybeare    14 年前

    这是不可能的。如果用户iPod应用程序正在播放iPod选项,则所有远程事件都将转到iPod,而不是您的应用程序。

        4
  •  0
  •   TuanCM    14 年前

    我注意到mpmediaitempropertyAssetURL的一点是,虽然返回的对象在nsurl中,但绝对字符串是这样的:

    iPod库://item/item.mp3?ID=580807975475997900

    这不是虚拟玩家想要的。avaudioplayer需要的是从具有有效文件路径的文件创建的nsurl对象。

    我不知道如何从mpmediaitem获取文件路径。所以我想如果你想在不使用mpmusicplayer的情况下播放ipod曲目,那么avplayer可能是一个不错的选择。