web-dev-qa-db-fra.com

Comment lire de l'audio mp3 à partir d'une URL dans ios swift

Je reçois une URL mp3 en réponse à l'appel de l'API. Je veux lire cet audio, alors comment faire? (ios Swift)

voici ma réponse

 {
    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";
}

voici mon code ::

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

}

où est-ce que je vais mal?

16
Govind

J'ai essayé ce qui suit,

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

Ajoutez les méthodes ci-dessous,

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

}

Et votre méthode de jeu telle qu'elle est,

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

}

Téléchargez le fichier mp3 puis essayez de le lire, AVAudioPlayer ne télécharge pas votre fichier mp3 pour vous. Je peux télécharger le fichier audio et le joueur le joue.

N'oubliez pas d'ajouter cela dans votre info.plist puisque vous chargez à partir d'une source http et que vous avez besoin de ce qui suit pour 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>
17
satheeshwaran

Utilisez AVPlayer au lieu d'AVAudioPlayer pour lire du contenu à distance. Selon la documentation, AVAudioPlayer a besoin d'un fichier mp3 pour lire l'audio. AVAudioPlayer ne prend pas en charge streaming .

Essayez ce code, ça marche bien pour moi

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

N'oubliez pas de définir App Transport Security (ATS) dans le fichier info.plist.

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

Puisque AVPlayer est très limité (par exemple, vous ne pouvez pas y changer url sans régénérer tout AVPlayer je pense que vous devriez utiliser AVQueuePlayer:

De la docs :

AVQueuePlayer est une sous-classe d'AVPlayer utilisée pour lire un certain nombre d'éléments en séquence. À l'aide de cette classe, vous pouvez créer et gérer une file d'attente d'éléments de lecteur comprenant des fichiers multimédias locaux ou téléchargés progressivement, tels que des films QuickTime ou des fichiers audio MP3, ainsi que des fichiers multimédias servis à l'aide de HTTP Live Streaming.

Donc, dans Swift 3 cela fonctionnera comme ceci:

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

Swift 4

1 - import AVFoundation

2 - déclarer un joueur

var player : AVPlayer?

3 - dans la fonction d'appel ViewDidLoad et passez l'url de streaming comme String

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

4 - fonction pour jouer

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
    }

Pour moi, c'est le moyen le plus simple et le plus simple de diffuser de l'audio en continu dans Swift.

4
oscar castellon

Après quelques recherches et quelques déceptions car aucune des réponses n'a résolu mon problème, je suis parvenu à une solution et voici le résultat final. La réponse acceptée est à moitié juste, vous devez toujours créer un 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()
3
Danilo Lemes

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