使用AVFoundation播放IOS音乐库内容

时间:2019-02-27 15:11:34

标签: ios swift avfoundation audio-player background-music

我正在尝试编写一个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没那么多)

1 个答案:

答案 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
        ]
    }
}