Как воспроизводить mp3-аудио с URL-адреса в ios swift

Я получаю mp3-url как ответ вызова api. Я хочу воспроизвести этот звук, так как я могу это сделать? (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://radio.spainmedia.es/wp-content/uploads/2015/12/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")
    }

}

Где я ошибаюсь?

Ответ 1

Я попробовал следующее:

    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 файл для вас. Я могу загрузить аудиофайл, и проигрыватель играет его.

Не забудьте добавить это в свой info.plist, поскольку вы загружаетесь из источника 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>

Ответ 2

Используйте AVPlayer вместо AVAudioPlayer для воспроизведения удаленного контента. Согласно документации AVAudioPlayer требуется mp3 файл для воспроизведения аудио. AVAudioPlayer не обеспечивает поддержку потоковой передачи.

Попробуйте этот код, его работа отлично для меня

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 установите защиту транспорта приложений (ATS).

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

Ответ 3

Так как AVPlayer очень ограничен (например, вы не можете изменить url там без регенерации целых AVPlayer Я думаю, вы должны использовать AVQueuePlayer:

Из docs:

AVQueuePlayer - это подкласс AVPlayer, используемый для воспроизведения множества элементов в последовательности. Используя этот класс, вы можете создавать и управлять очередью элементы игрока, состоящие из локальных или постепенно загружаемых файлов медиа, например фильмы QuickTime или аудиофайлы MP3, а также медиа с помощью HTTP Live Streaming.

Итак, в 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()
    }
}

Ответ 4

Для воспроизведения звука в swift2 используется

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

Сообщите мне, если он работает.