使用AvFoundation播放iOS音乐库内容



我正在尝试编写一个iOS应用程序,该应用程序将播放我的iPhone音乐库内容,显示艺术品和"宣布"标题,艺术家等。

我使用Apple的媒体播放器框架可以很好地工作。我可以在选定的播放列表中显示播放列表,并在选定的播放列表中排队。我使用" mpmusicplayercontrollernowplayingitemdidchange"观察者通知来暂停播放,检索元数据,并通过Avspeechsynthesizer进行公告。我是一个快乐的露营者,直到我遇到可怕的"媒体播放器框架没有回应后台的观察者通知"。

所以,我开始查看Avoundation框架。我找到了一个示例,该示例在后台通过URL播放本地歌曲文件。我试图通过Avfoundation检索音乐库内容的惨败。我也未能通过媒体播放器框架为AvFoundation播放器提供检索到的内容。(注意:从mpMediaItem检索的URL为伪造的" ipod-library://item/item.m4a?id = ################################# "格式。使用此" URL"创建AvplayerItem不起作用。)

有人成功实现了这一目标吗?我正在开发自己的用法。我无意在Apple的App Store中发布该应用程序,因此我愿意使用隐藏的API或未经应用批准的方法。

一个快速的代码示例将很棒。(Objective-C不是很多)

从用户库中获取了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
        ]
    }
}

最新更新