Как играть mp3 аудио с URL в ios swift

Я получаю url mp3 в качестве ответа на вызов api. Я хочу воспроизвести этот звук, так как я могу это сделать? (ios swift)

вот мой ответ

 {
    content = "En este primer programa se tratarU00e1n asuntos tan importante como este y aquel sin descuidar un poco de todo lo demU00e1s";
    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")
    }

}

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

7 ответов


я попробовал следующее,

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

не забудьте добавить это в вашем инфо.файл plist, так как вы загружаете из адресу http source и вам нужно, чтобы ниже было установлено для 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>

использовать "Плеерав" вместо 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")
    }
}

пожалуйста, имейте в виду, чтобы установить App Transport Security(ATS) в info.plist файл.

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

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

AVPlayerLayer

let url = URL(string: "https://www.myinstants.com/media/sounds/cade-o-respeito.mp3" ?? "")
playerItem = AVPlayerItem(url: url!)
player = AVPlayer(playerItem: playerItem)

let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = CGRect(x: 0, y: 0, width: 10, height: 10)
self.contentView.layoutSublayers(of: playerLayer)

player?.play()

Swift 4

func playSound(soundUrl: String) {
    let sound = URL(fileURLWithPath: soundUrl)
    do {
        let audioPlayer = try AVAudioPlayer(contentsOf: sound)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    }catch let error {
        print("Error: \(error.localizedDescription)")
    }
}

SWIFT 4

1 - import AVFoundation

2 - объявить игрока

var player : AVPlayer?

3 - в функции вызова ViewDidLoad и передать URL-адрес потоковой передачи, как строка

loadRadio(radioURL: (radioStation?.streamURL)!)

4 - функция играть

func loadRadio(radioURL: String) {

        guard let url = URL.init(string: radioURL) else { return }
        let playerItem = AVPlayerItem.init(url: url)
        player = AVPlayer.init(playerItem: playerItem)
        player?.play()
        startNowPlayingAnimation(true)
        played = true
    }

для меня это лучший и простой способ потокового аудио в swift.


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

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

Дайте мне знать, если это работает.