首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AVFoundation播放IOS音乐库内容

使用AVFoundation播放IOS音乐库内容
EN

Stack Overflow用户
提问于 2019-02-27 23:11:34
回答 1查看 945关注 0票数 0

我正在尝试编写一个IOS应用程序,它将播放我的iPhone音乐库内容,显示艺术作品,并“宣布”标题,艺术家等。

我使用苹果的媒体播放器框架让它工作得很好。我可以显示播放列表名称,并在选定的播放列表中对歌曲进行排队。我使用"MPMusicPlayerControllerNowPlayingItemDidChange“观察者通知来暂停回放、检索元数据,并通过AVSpeechSynthesizer执行公告。我是一个快乐的露营者,直到我遇到了可怕的“媒体播放器框架不响应后台观察者通知”问题。

所以,我开始研究AVFoundation框架。我在后台找到了一个通过URL播放本地歌曲文件的示例。在尝试通过AVFoundation检索音乐库内容时,我失败了。我也未能将通过媒体播放器框架检索到的内容提供给AVFoundation播放器。(注意:从MPMediaItem检索到的URL是伪造的URL格式。使用此"URL“创建AVPlayerItem不起作用。)

有没有人能做到这一点?我正在为我自己的用途开发。我不打算在苹果的app Store上发布这个应用程序,所以我愿意使用隐藏的API或非Apple批准的方法。

一个Swift代码示例会很棒。(Objective-C并非如此)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-27 23:22:36

从用户的库中获取MPMediaItem后,获取其assetURL。从生成的URL创建AVPlayer是可行的。

来自我的一个示例应用程序的实际代码:

代码语言:javascript
复制
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
        ]
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54908599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档