我正在尝试编写一个IOS应用程序,该应用程序将播放我的iPhone音乐库内容,显示作品以及“宣布”标题,艺术家等。
我使用Apple的Media Player框架可以很好地工作。我可以显示播放列表名称,并将歌曲排入所选播放列表。 我使用“ MPMusicPlayerControllerNowPlayingItemDidChange”观察者通知来暂停播放,检索元数据并通过AVSpeechSynthesizer进行通知。 在遇到令人恐惧的“ Media Player框架无法在后台响应观察者通知”问题之前,我一直是一个快乐的露营者。
因此,我开始研究AVFoundation框架。我发现了一个示例,该示例在后台通过URL播放本地歌曲文件。 我在尝试通过AVFoundation检索音乐库内容时失败了。 我也无法将通过Media Player框架检索的内容提供给AVFoundation播放器。 (注意:从MPMediaItem检索的URL是伪造的“ ipod-library://item/item.m4a?id = ##################### ##### ”格式。使用此“ URL”创建AVPlayerItem无效。)
有人能做到吗?我正在开发自己的用法。我无意将应用程序发布到Apple的App Store中,因此我愿意使用隐藏的API或未经Apple认可的方法。
一个Swift代码示例会很棒。 (Objective-C没那么多)
答案 0 :(得分:0)
已从用户的库中获取了MPMediaItem,并获取其assetURL
。从结果URL创建AVPlayer确实可以。
我的一个示例应用中的实际代码:
func oneSong () -> (URL?, String?) {
let query = MPMediaQuery.songs()
// always need to filter out songs that aren't present
let isPresent = MPMediaPropertyPredicate(value:false,
forProperty:MPMediaItemPropertyIsCloudItem,
comparisonType:.equalTo)
query.addFilterPredicate(isPresent)
let item = query.items?[0]
return (item?.assetURL, item?.title)
}
@IBAction func doPlayOneSongAVPlayer (_ sender: Any) {
let (url, title) = self.oneSong()
if let url = url, let title = title {
self.avplayer = AVPlayer(url:url)
self.avplayer.play()
MPNowPlayingInfoCenter.default().nowPlayingInfo = [
MPMediaItemPropertyTitle : title
]
}
}