首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >苹果音乐与AVAudioEngine在斯威夫特

苹果音乐与AVAudioEngine在斯威夫特
EN

Stack Overflow用户
提问于 2016-03-23 00:42:24
回答 1查看 1.3K关注 0票数 2

如何使用AVAudioPlayerNode/AVAudioEngine访问Apple库中的歌曲以进行播放和处理?

我在苹果论坛上问过这个问题。

EN

回答 1

Stack Overflow用户

发布于 2019-07-03 09:57:54

“苹果音乐”可指:

  • 音乐流媒体服务
  • 它的iOS客户端(称为“音乐”)
  • 它的macOS客户端,作为本地媒体管理和播放应用程序(以前称为iTunes,macOS Catalina被称为“音乐”)。

由于DRM的限制,无法播放从苹果音乐目录下载到您的设备从苹果音乐macOS或iOS客户端的曲目。但是,您可以播放您拥有的并且有使用macOS音乐应用程序或Finder应用程序安装到设备上的音频文件,如下所示:

  1. NSAppleMusicUsageDescription键添加到Info.plist文件及其相应的值
  2. 设置AVAudioSessionAVAudioEngine
  3. 查找您想要播放的媒体项的URL (您可以使用MPMediaPickerController,如下面的示例所示,也可以创建自己的MPMediaQuery)
  4. 从该URL创建一个AVAudioFile
  5. 创建一个AVAudioPlayerNode集来播放该AVAudioFile
  6. 将player节点连接到引擎的输出节点
代码语言:javascript
复制
import UIKit
import AVFoundation
import MediaPlayer

class ViewController: UIViewController {

    let engine = AVAudioEngine()

    override func viewDidLoad() {
        super.viewDidLoad()

        let mediaPicker = MPMediaPickerController(mediaTypes: .music)
        mediaPicker.allowsPickingMultipleItems = false
        mediaPicker.showsItemsWithProtectedAssets = false // These items usually cannot be played back
        mediaPicker.showsCloudItems = false // MPMediaItems stored in the cloud don't have an assetURL
        mediaPicker.delegate = self
        mediaPicker.prompt = "Pick a track"
        present(mediaPicker, animated: true, completion: nil)
    }

    func startEngine(playFileAt: URL) {
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback)

            let avAudioFile = try AVAudioFile(forReading: playFileAt)
            let player = AVAudioPlayerNode()

            engine.attach(player)
            engine.connect(player, to: engine.mainMixerNode, format: avAudioFile.processingFormat)

            try engine.start()
            player.scheduleFile(avAudioFile, at: nil, completionHandler: nil)
            player.play()
        } catch {
            assertionFailure(String(describing: error))
        }
    }
}

extension ViewController: MPMediaPickerControllerDelegate {
    func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
        guard let item = mediaItemCollection.items.first else {
            print("no item")
            return
        }
        print("picking \(item.title!)")
        guard let url = item.assetURL else {
            return print("no url")
        }

        dismiss(animated: true) { [weak self] in
            self?.startEngine(playFileAt: url)
        }
    }

    func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) {
        dismiss(animated: true, completion: nil)
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36167852

复制
相关文章

相似问题

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