Je teste actuellement l'utilisation d'AVPlayer avec une URL de streaming audio, en utilisant Swift . Il existe des méthodes play () et pause () , mais le problème est que, en pause uniquement, le flux reste mis en cache dans le périphérique.
Voici mon code de test:
import UIKit
import AVFoundation
class ViewController: UIViewController {
let player = AVPlayer(URL: NSURL(string: "http://streaming.radio.rtl.fr/rtl-1-48-192")!)
@IBOutlet weak var btnPlay: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnPress(sender: AnyObject) {
if (btnPlay.titleLabel?.text == "Play") {
initPlayer()
btnPlay.setTitle("Stop", forState: UIControlState.Normal)
} else {
stopPlayer()
btnPlay.setTitle("Play", forState: UIControlState.Normal)
}
}
func initPlayer() {
player.play()
}
func stopPlayer() {
// player.currentItem = nil // Last thing I tried, but generate an error
player.pause()
}
}
Voici les problèmes lorsque vous essayez quelque chose:
player = nil
: "Impossible d'attribuer une valeur de type 'NilLiteralCOnvertible' à une valeur de type 'AVPlayer'"
player.currentItem = nil
: "Impossible d'attribuer à la propriété: 'currentItem' est une propriété get-only"
J'ai tout essayé, même via AVQueuePlayer sans aucun résultat efficace. (évidemment, puisque je n'ai qu'un seul article dans mon cas).
Comment arrêter AVPlayer ou détruire son instance ?
Si vous déclarez player
en tant que variable facultative, vous pouvez ensuite définir le lecteur sur nil
pour le désallouer.
Exemple idiot mais il montre ce qui se passe:
import UIKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var btnPlay: UIButton!
var player:AVPlayer?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnPress(sender: AnyObject) {
if (btnPlay.titleLabel?.text == "Play") {
initPlayer()
btnPlay.setTitle("Stop", forState: UIControlState.Normal)
} else {
stopPlayer()
btnPlay.setTitle("Play", forState: UIControlState.Normal)
}
}
func initPlayer() {
if let play = player {
print("playing")
play.play()
} else {
print("player allocated")
player = AVPlayer(URL: NSURL(string: "http://streaming.radio.rtl.fr/rtl-1-48-192")!)
print("playing")
player!.play()
}
}
func stopPlayer() {
if let play = player {
print("stopped")
play.pause()
player = nil
print("player deallocated")
} else {
print("player was already deallocated")
}
}
}
À partir de cela post J'ai trouvé la meilleure solution pour arrêter complètement AVPlayer avant de quitter ou de démarrer un nouveau lecteur:
videoPlayer.replaceCurrentItemWithPlayerItem(nil)
[Mise à jour] Pour Swift 3:
player.replaceCurrentItem(with: nil)
Version Swift 3:
player.replaceCurrentItem(with: nil)
Déclarez la variable avplayer nil et attribuez l'url à avplayer lorsque vous initialisez le lecteur. Je pense que ce code vous aidera. Vous pouvez également utiliser le code de @ayaio.
Voici le code modifié:
importer UIKit
importer AVFoundation
classe ViewController: UIViewController {
let player = AVPlayer?]
@IBOutlet weak var btnPlay: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnPress(sender: AnyObject) {
if (btnPlay.titleLabel?.text == "Play") {
initPlayer()
btnPlay.setTitle("Stop", forState: UIControlState.Normal)
} else {
stopPlayer()
btnPlay.setTitle("Play", forState: UIControlState.Normal)
}
}
func initPlayer(strUrl : String) {
player = AVPlayer(URL : URL(string : strUrl!)
player.play()
}
func stopPlayer() { //For Pause
player.pause()
player = nil //Assign nil to player destroy player object
}
}