我正在尝试编写一个IOS应用程序,它将播放我的iPhone音乐库内容,显示艺术作品,并“宣布”标题,艺术家等。
我使用苹果的媒体播放器框架让它工作得很好。我可以显示播放列表名称,并在选定的播放列表中对歌曲进行排队。我使用"MPMusicPlayerControllerNowPlayingItemDidChange“观察者通知来暂停回放、检索元数据,并通过AVSpeechSynthesizer执行公告。我是一个快乐的露营者,直到我遇到了可怕的“媒体播放器框架不响应后台观察者通知”问题。
所以,我开始研究AVFoundation框架。我在后台找到了一个通过URL播放本地歌曲文件的示例。在尝试通过AVFoundation检索音乐库内容时,我失败了。我也未能将通过媒体播放器框架检索到的内容提供给AVFoundation播放器。(注意:从MPMediaItem检索到的URL是伪造的URL格式。使用此"URL“创建AVPlayerItem不起作用。)
有没有人能做到这一点?我正在为我自己的用途开发。我不打算在苹果的app Store上发布这个应用程序,所以我愿意使用隐藏的API或非Apple批准的方法。
一个Swift代码示例会很棒。(Objective-C并非如此)
发布于 2019-02-27 23:22:36
从用户的库中获取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
]
}
}https://stackoverflow.com/questions/54908599
复制相似问题