gpt4 book ai didi

swift - Swift 中的 Apple Music 和 AVAudioEngine

转载 作者:行者123 更新时间:2023-12-02 04:12:08 26 4
gpt4 key购买 nike

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

我在 Apple forum 中问过这个问题.

最佳答案

“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. 找到您要播放的媒体项目的网址(您可以使用 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)
}
}

关于swift - Swift 中的 Apple Music 和 AVAudioEngine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36167852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com