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?
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>
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>
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()
}
}
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.
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()
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)")
}
}