无法阻止AVPlayer
我目前正在使用Swift测试AVPlayer与音频流url的使用。 有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
:“无法将’NilLiteralCnvertible’类型的值赋给’AVPlayer’类型的值”
player.currentItem = nil
:“无法分配给属性:’currentItem’是一个只用属性”
我尝试了一切,甚至通过AVQueuePlayer没有任何有效的结果。 (显然,因为我的情况只有一个项目)。
如何停止AVPlayer或销毁他的实例 ?
如果您将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") } } }
从这篇文章中我发现了在离开或开始新玩家之前完全停止AVPlayer的最佳解决方案:
videoPlayer.replaceCurrentItemWithPlayerItem(nil)
SWIFT 3版本:
player.replaceCurrentItem(with: nil)