【问题标题】:Apple Music & AVAudioEngine in SwiftSwift 中的 Apple Music 和 AVAudioEngine
【发布时间】:2016-03-23 00:42:24
【问题描述】:

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

我已经在Apple forum问过这个问题。

【问题讨论】:

  • 所以 this 帖子的目的是抱怨 Apple 没有回复您在其论坛上的 other 帖子?
  • Apple 更有可能关注这个亟待解决的问题。
  • 你是指云流媒体库,还是设备上的库?
  • 我的意思是在设备上
  • 这是否与 MPMusicPlayerController 一起用于用户 iTunes 库中的非苹果音乐歌曲?

标签: swift avaudioengine apple-music


【解决方案1】:

“Apple Music”可能指:

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

由于 DRM 限制,无法播放从 Apple Music macOS 或 iOS 客户端下载到您设备上的 Apple Music 目录中的曲目。但是,您可以播放您拥有synced onto your device using the macOS Music app or the Finder app 的音频文件,如下所示:

  1. NSAppleMusicUsageDescription 键添加到您的 Info.plist 文件中,并添加相应的值
  2. 设置您的AVAudioSessionAVAudioEngine
  3. 找到您要播放的媒体项目的 URL(您可以使用MPMediaPickerController,如下例所示,也可以自己创建MPMediaQuery
  4. 从该 URL 创建一个 AVAudioFile
  5. 创建一个AVAudioPlayerNode 集以播放该AVAudioFile
  6. 将播放器节点连接到引擎的输出节点
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)
    }
}

【讨论】:

  • 请注意,如果任何人没有从某些曲目中获取 url,请确保设置 mediaPicker.showsItemsWithProtectedAssets = false 以便选择器忽略 DRM 保护的内容,您无法将其加载到 AVAudioPlayerNode 中。
  • 干杯@SamBing。我已经相应地更新了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多