Realmente estoy luchando por resolver algo y he buscado en Internet y no puedo encontrar una respuesta. Como sabe, las aplicaciones de música como Spotify y Apple Music le permiten al usuario reorganizar la siguiente cola incluso mientras escucha una canción. No he sido capaz de averiguar cómo hacer lo mismo. Quiero poder reorganizar completamente la cola, lo que incluye agregar, eliminar y mover canciones en la siguiente cola. He intentado varias formas de hacerlo, como
musicPlayer.setQueue([queue]) pero esto me obligaría a llamar a musicPlayer.prepareToPlay() después de actualizar la cola, lo que terminaría con la canción actual e iniciaría la nueva cola.
También he intentado usar
musicPlayer.perform(queueTransaction: { (currentQueue) in let oldItems = currentQueue.items var currentItem: MPMediaItem? = nil for (i, item) in oldItems.enumerated() { if i == musicPlayer.indexOfNowPlayingItem { currentItem = item continue } currentQueue.remove(item) } currentQueue.insert(queue, after: currentItem) }, completionHandler: { (newQueue, error) in if let error = error { print("there was an error updating the queue", error) return } print("=== NEW QUEUE ===") //insert does not work for item in newQueue.items { print(" -", item.title ?? "[No Title]") } })pero como sabrá por esta pregunta: MPMusicPlayerControllerMutableQueue inserta una canción de Apple Music que no funciona
la función de inserción después del elemento de una cola no parece funcionar (y también he intentado configurar el elemento en cero, lo que a veces elimina el elemento actual y establece la cola en nada). También sé sobre musicPlayer.prepend([queue]) que agregará la nueva cola después del elemento que se está reproduciendo actualmente, pero también tendría que eliminar la cola anterior de la memoria para que la siguiente cola no tenga más de 300 canciones. . También intenté usar la función prepend dentro de la transacción de la cola, pero a veces la canción se detenía en el medio y el reproductor de música configuraba nowPlayingItem en cero. Realmente espero que alguien sepa la respuesta a esto porque he tenido este problema durante más de 4 días y parece que no puedo encontrar una solución que funcione el 100% del tiempo.
MPMusicPlayerController (y sus subclases relacionadas) hace que sea muy difícil administrar una cola como esta sin problemas. Si no recuerdo mal, ni siquiera puede agregar objetos MPMediaItem duplicados a la cola, y al tocar los medios de reproducción desde el Centro de control, en realidad se iniciará la aplicación Música en lugar de la suya. Esencialmente, su aplicación solo puede actuar como un caparazón para la experiencia de reproducción de música, y la aplicación Música está haciendo todo el trabajo pesado.
Dependiendo de sus requisitos, puede tener otra opción, aunque con algunos compromisos. El marco de trabajo de AVFoundation proporcionaAVPlayer y AVQueuePlayer , que facilitan la administración de una cola y brindan opciones de reproducción más avanzadas. Sin embargo, está limitado a reproducir solo contenido descargado y sin DRM (es decir, las canciones de Apple Music no funcionarán).
Configura tu reproductor:
let audioPlayer = AVQueuePlayer() // Play next song in queue. NotificationCenter.default.addObserver(self, selector: #selector(didPlayToEndTime), name: .AVPlayerItemDidPlayToEndTime, object: nil) // Recover from failed playback. NotificationCenter.default.addObserver(self, selector: #selector(failedToPlayToEndTime(_:)), name: .AVPlayerItemFailedToPlayToEndTime, object: nil) // Resume music after interruptions. NotificationCenter.default.addObserver(self, selector: #selector(handleAudioSessionInterruption(_:)), name: .AVAudioSessionInterruption, object: AVAudioSession.sharedInstance())Insertar nuevos elementos en la cola:
let media = MPMediaQuery.songs() let mediaItem: MPMediaItem = media.items.first! // MPMediaItem objects stored in iCloud or from Apple Music // will not have a URL, therefore, they cannot be played. guard let assetURL: URL = mediaItem.assetURL else { return } let playerItem = AVPlayerItem(url: assetURL) playerItem.seek(to: kCMTimeZero) audioPlayer.insert(playerItem, after: nil) En mi aplicación de reproductor de música, mantengo una Array de medios para que sea realmente sencillo reordenar, insertar y eliminar medios, y un índice para realizar un seguimiento de la pista que se está reproduciendo actualmente. Luego paso los medios a AVQueuePlayer uno o dos a la vez, de modo que no tengo que jugar con sus API para insertar/eliminar medios.