Подтвердить что ты не робот

Невозможно остановить AVPlayer

В настоящее время я тестирую использование AVPlayer со звуковым потоком URL, используя Swift. Существуют play() и pause() методы, но проблема в том, что, только приостанавливаясь, поток остается кэшированным в устройстве.

Вот мой тестовый код:

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

Вот проблемы при попытке чего-то:

player = nil: "Невозможно присвоить значение типа" NilLiteralCOnvertible "значению типа" AVPlayer "

player.currentItem = nil: "Невозможно назначить свойство:" currentItem "- свойство get-only"


Я пробовал все, даже через AVQueuePlayer без какого-либо эффективного результата. (очевидно, поскольку в моем случае у меня есть только один элемент).

Как остановить AVPlayer или уничтожить его экземпляр?

4b9b3361

Ответ 1

Если вы объявите player в качестве необязательной переменной, вы можете установить плеер на nil, чтобы освободить его.

Глупый пример, но он показывает, что происходит:

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

Ответ 3

Версия SWIFT 3:

player.replaceCurrentItem(with: nil)