【问题标题】:Play IOS Music Library Content Using AVFoundation使用 AVFoundation 播放 IOS 音乐库内容
【发布时间】:2019-02-27 15:11:33
【问题描述】:

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

我使用 Apple 的 Media Player 框架让它运行良好。我可以显示播放列表名称并将歌曲排列在选定的播放列表中。 我使用“MPMusicPlayerControllerNowPlayingItemDidChange”观察者通知来暂停播放、检索元数据并通过 AVSpeechSynthesizer 进行公告。 在遇到可怕的“媒体播放器框架在后台不响应观察者通知”问题之前,我一直是个快乐的露营者。

所以,我开始研究 AVFoundation 框架。我发现了一个通过后台 URL 播放本地歌曲文件的示例。 我在尝试通过 AVFoundation 检索音乐库内容时失败了。 我也未能将通过媒体播放器框架检索到的内容提供给 AVFoundation 播放器。 (注意:从 MPMediaItem 检索到的 URL 是伪造的“ipod-library://item/item.m4a?id=################### #####”格式。用这个“URL”创建AVPlayerItem是行不通的。)

有没有人设法做到这一点?我正在开发自己的用途。我无意在 Apple 的 App Store 中发布该应用,因此我愿意使用隐藏的 API 或未经 Apple 批准的方法。

一个 Swift 代码示例会很棒。 (Objective-C 没那么多)

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我正在使用从 MPMediaItems URL 创建 AVPlayerItems 数组并填充 AVQueuePlayer .....不高兴。你的建议很有效。
    • 完成。我是否更正了 AVAudioPlayer 在模拟器中不起作用?它在“sideloaded”时工作(我认为这是通过 Xcode 在物理设备上部署的正确术语。) MPMediaPlayer 在模拟器中工作。
    • 据我所知,AVAudioPlayer 在模拟器中运行良好,AVPlayer(在我的示例中使用)也是如此。然而,我很惊讶 MPMediaPlayer 可以在模拟器中为您工作,因为一开始就无法将可​​播放媒体放到模拟器上。出于这个原因,该设备是我唯一实际运行过该代码的地方。
    • 不要争论,但您关于无法向模拟器添加音乐的评论是不正确的。我已经按照stackoverflow 帖子link 完成了它。我扩展它并编写了一个使用软链接为所有设备模拟器提供音乐的applescript。我将代码发布到上面的链接,但它被拒绝为“不回答问题”。
    • 我明白了。然而,对我的血液来说太老套了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多