无法停止 AVPlayer
Impossible to stop AVPlayer
我目前正在使用 Swift 测试 AVPlayer 与音频流的使用 url。有 play() and 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
: "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"
我尝试了所有方法,甚至 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")
}
}
}
从这个post我找到了在您离开或开始新播放器之前完全停止 AVPlayer 的最佳解决方案:
videoPlayer.replaceCurrentItemWithPlayerItem(nil)
[更新] 对于 SWIFT 3:
player.replaceCurrentItem(with: nil)
SWIFT 3 版本:
player.replaceCurrentItem(with: nil)
我目前正在使用 Swift 测试 AVPlayer 与音频流的使用 url。有 play() and 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
: "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"
我尝试了所有方法,甚至 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")
}
}
}
从这个post我找到了在您离开或开始新播放器之前完全停止 AVPlayer 的最佳解决方案:
videoPlayer.replaceCurrentItemWithPlayerItem(nil)
[更新] 对于 SWIFT 3:
player.replaceCurrentItem(with: nil)
SWIFT 3 版本:
player.replaceCurrentItem(with: nil)