首页 文章

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

提问于
浏览
9

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

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

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

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

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

  • 如果您尝试使用AVAudioPlayer的实例来获取远程事件(例如,使用空白声音文件),然后同时使用MPMusicPlayer类播放iPod音乐,您可以进行远程控制访问,直到您实际启动iPod播放时为止因为您的音频会话被取消激活并且系统音频会话变为活动状态而丢失它 .

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

简而言之,每当MPMusicPlayer正在播放时,我似乎无法获得远程事件,除了使用MPMusicPlayer之外,我不知道从iPod库中播放内容的任何其他方式 .

ANY 关于如何解决这个问题的建议将受到欢迎 . 创意或平淡的疯狂 . 只要它有效,就不要在意 .

任何人?任何人? Bueller? Bueller?

中号

4 回答

  • 2

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

    以下是如何在您的应用中播放iPod音乐,具有后台支持,以及您的应用接收遥控器通知 .

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

    做完了!

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

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

  • 0

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

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

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

    缺点是你的应用程序将在任何时候都没有充分的理由运行(但是,公平地说,如果iOS编程正确,后台线程无所事事应该几乎不消耗电池) .

    另一种选择:使用MPMoviePlayer?我已经检查过它在后台工作正常,并且还应该接收远程控制事件 . 它本身可以播放MPMediaItem,所以希望Audible.com文件也是......

  • 16

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

  • 0

    有人认为我注意到了MPMediaItemPropertyAssetURL是这样的,虽然返回的对象是NSURL,但absoluteString是这样的:

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

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

    我不知道如何从MPMediaItem获取文件路径 . 所以我想如果你想在不使用MPMusicPlayer的情况下播放iPod音轨,AVPlayer可能就是这样 .

相关问题