Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Impossible to stop AVPlayer

I am currently testing the use of AVPlayer with audio streaming url, using Swift. There are play() and pause() methods, but the problem is that, pausing only, the stream remains cached in the device.

Here is my test code :

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

Here are the issues when trying somethings :

player = nil : "Cannot assign a value of type 'NilLiteralCOnvertible' to a value of type 'AVPlayer'"

player.currentItem = nil : "Cannot assign to property: 'currentItem' is a get-only property"


I tried everything, even through AVQueuePlayer without any effective result. (obviously, since I only have one item in my case).

How to stop AVPlayer or destroy his instance ?

like image 458
w3spi Avatar asked Oct 07 '15 13:10

w3spi


3 Answers

From this post I found the best solution to completely stop AVPlayer before you leave or start a new player:

videoPlayer.replaceCurrentItemWithPlayerItem(nil)

[Update] For SWIFT 3:

player.replaceCurrentItem(with: nil)
like image 74
taynguyen Avatar answered Nov 20 '22 09:11

taynguyen


If you declare player as an optional variable, you can then set the player to nil to deallocate it.

Silly example but it shows what happens:

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")
        }
    }
}
like image 42
Eric Aya Avatar answered Nov 20 '22 09:11

Eric Aya


SWIFT 3 Version:

player.replaceCurrentItem(with: nil)
like image 9
Krishna Kirana Avatar answered Nov 20 '22 07:11

Krishna Kirana