Apple Music и AVAudioEngine на Swift

Как мы можем получить доступ к песням в библиотеке Apple Music с _1 _ / _ 2_ для воспроизведения и обработки?

Я задал этот вопрос на форуме Apple.


person Ivan    schedule 23.03.2016    source источник
comment
Итак, цель этого сообщения - пожаловаться на то, что Apple не ответила на ваше другое сообщение на их форуме?   -  person matt    schedule 23.03.2016
comment
Скорее всего, Apple обратит внимание на животрепещущий вопрос.   -  person Ivan    schedule 23.03.2016
comment
Вы конкретно имеете в виду библиотеку потоковой передачи в облаке или библиотеку на устройстве?   -  person Chris    schedule 05.05.2017
comment
Я имею в виду на устройстве   -  person Ivan    schedule 13.07.2017
comment
Работает ли это с MPMusicPlayerController для музыкальных композиций, отличных от Apple, в библиотеке iTunes пользователя?   -  person TheJeff    schedule 07.05.2019


Ответы (1)


Apple Music может относиться к:

  • сервис потоковой передачи музыки
  • его клиент iOS (известный как Music)
  • его клиент macOS, который также является локальным приложением для управления и воспроизведения мультимедиа (ранее известный как iTunes, известный как Music в macOS Catalina).

Из-за ограничений DRM невозможно воспроизводить треки из каталога Apple Music, загруженные на ваше устройство из клиентов Apple Music для macOS или iOS. Однако вы можете воспроизводить аудиофайлы, принадлежащие и синхронизированы на вашем устройстве с помощью приложения macOS Music или Finder следующим образом:

  1. Добавьте ключ NSAppleMusicUsageDescription в файл Info.plist и соответствующее ему значение
  2. Настройте свои AVAudioSession и AVAudioEngine
  3. Найдите URL-адрес мультимедийного элемента, который вы хотите воспроизвести (вы можете использовать MPMediaPickerController, как в примере ниже, или вы можете создать свой собственный MPMediaQuery)
  4. Создайте AVAudioFile из этого URL
  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)
    }
}
person Eric    schedule 03.07.2019
comment
Примечание для тех, кто не получает обратно URL-адрес определенных треков, обязательно установите mediaPicker.showsItemsWithProtectedAssets = false, чтобы средство выбора пропускало защищенный DRM контент, который вы не можете загрузить в AVAudioPlayerNode. - person Sam Bing; 27.08.2020
comment
Приветствую @SamBing. Я обновил код соответствующим образом. - person Eric; 01.09.2020