web-dev-qa-db-fra.com

Impossible d'arrêter AVPlayer

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 ?

21
Zl3n

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

À 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)
36
taynguyen

Version Swift 3:

player.replaceCurrentItem(with: nil)
3
Krishna Kirana

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
}

}

0
Nayan Bhut