斯威夫特 5
我参加演出有点晚了,但这就是我想出的。(我正在修剪歌曲以使用描述符播放)。
确保在主线程上使用音乐播放器运行所有内容。否则,您将遇到奇怪的错误。
通过 persistentId 获取歌曲:
/// Retrieves a song in the MPMediaItem format using the persistentId passed.
/// - Parameter persistentID: (UInt64) The songs persistentId.
/// - Returns: (MPMediaItem?) Nil if not found other wise the MPMediaItem (song).
private static func getSong(forId persistentID: UInt64) -> MPMediaItem? {
let query = MPMediaQuery.songs()
let predicate = MPMediaPropertyPredicate(value: persistentID, forProperty: MPMediaItemPropertyPersistentID)
query.addFilterPredicate(predicate)
return query.items?.first
}
通过 persistentId 播放歌曲:
private var startTime: Double = 0
private var endTime: Double = 0
/// Plays the song with the identifier.
/// - Note: Trims song to start and end time.
/// - Parameter persistentId: (UInt64) The song persistent identifier.
private func play(forId persistentId: UInt64) {
DispatchQueue.main.async {
if let song = Self.getSong(forId: persistentId) {
let identifier = MPMediaItemPropertyPersistentID
let predicate = MPMediaPropertyPredicate(value: persistentId, forProperty: identifier)
let query = MPMediaQuery(filterPredicates: [predicate])
let descriptor = MPMusicPlayerMediaItemQueueDescriptor(query: query)
descriptor.setStartTime(self.startTime, for: song)
descriptor.setEndTime(self.endTime, for: song)
self.musicPlayer.setQueue(with: descriptor)
self.musicPlayer.prepareToPlay()
self.musicPlayer.repeatMode = .none
self.musicPlayer.play()
}
}
}
我还发现初始化音乐控制器的方式很重要:
private lazy var musicPlayer: MPMusicPlayerController = { MPMusicPlayerController.applicationQueuePlayer }()
请注意:有些代码不是拖放的。您需要定义诸如开始和结束时间变量之类的东西。