Luego de indagar en diversos repositorios y foros de internet al final hemos descubierto la solución que te compartiremos aquí.
Solución:
Use AVPlayer en lugar de AVAudioPlayer para reproducir contenido remoto. Según la documentación, AVAudioPlayer necesita un archivo mp3 para reproducir audio. AVAudioPlayer no brinda soporte para transmisión.
Prueba este código, me funciona bien
func play(url:NSURL)
print("playing (url)")
do
let playerItem = AVPlayerItem(URL: url)
self.player = try AVPlayer(playerItem:playerItem)
player!.volume = 1.0
player!.play()
catch let error as NSError
self.player = nil
print(error.localizedDescription)
catch
print("AVAudioPlayer init failed")
Tenga en cuenta que debe configurar App Transport Security (ATS) en el archivo info.plist.
NSAppTransportSecurity
NSAllowsArbitraryLoads
Intenté lo siguiente,
let urlstring = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tailtoddle_lo4.mp3"
let url = NSURL(string: urlstring)
print("the url = (url!)")
downloadFileFromURL(url!)
Agregue los siguientes métodos,
func downloadFileFromURL(url:NSURL)
var downloadTask:NSURLSessionDownloadTask
downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(url, completionHandler: [weak self](URL, response, error) -> Void in
self?.play(URL)
)
downloadTask.resume()
Y tu método de juego tal como es,
func play(url:NSURL)
print("playing (url)")
do
self.player = try AVAudioPlayer(contentsOfURL: url)
player.prepareToPlay()
player.volume = 1.0
player.play()
catch let error as NSError
//self.player = nil
print(error.localizedDescription)
catch
print("AVAudioPlayer init failed")
Descargue el archivo mp3 y luego intente reproducirlo, de alguna manera AVAudioPlayer no descarga su archivo mp3 por usted. Puedo descargar el archivo de audio y el reproductor lo reproduce.
Recuerde agregar esto en su info.plist ya que está cargando desde un http fuente y necesita configurar lo siguiente para iOS 9+
NSAllowsArbitraryLoads
Ya que AVPlayer
es muy limitado (por ejemplo, no puede cambiar url
ahí sin regenerar entera AVPlayer
Creo que deberías usar AVQueuePlayer
:
De los documentos:
AVQueuePlayer es una subclase de AVPlayer que se utiliza para reproducir una serie de elementos en secuencia. Con esta clase, puede crear y administrar una cola de elementos del reproductor compuesta por medios basados en archivos locales o descargados progresivamente, como películas QuickTime o archivos de audio MP3, así como medios servidos mediante HTTP Live Streaming.
así que en rápido 3 funcionará así:
lazy var playerQueue : AVQueuePlayer =
return AVQueuePlayer()
()
…
func playTrackOrPlaylist
if let url = track.streamURL() //this is an URL fetch from somewhere. In this if you make sure that URL is valid
let playerItem = AVPlayerItem.init(url: url)
self.playerQueue.insert(playerItem, after: nil)
self.playerQueue.play()
Comentarios y valoraciones
Al final de la página puedes encontrar las aclaraciones de otros usuarios, tú incluso tienes la habilidad dejar el tuyo si lo deseas.