首页 文章

无法阻止AVPlayer

提问于
浏览
19

我目前正在使用 Swift 测试AVPlayer与音频流网址的使用情况 . 有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()
    }
}

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"


我尝试了一切,甚至通过AVQueuePlayer没有任何有效的结果 . (显然,因为我的情况只有一个项目) .

如何 stop AVPlayerdestroy his instance

3 回答

  • 29

    如果将 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")
            }
        }
    }
    
  • 17

    从这个post我找到了在离开或开始新玩家之前完全停止AVPlayer的最佳解决方案:

    videoPlayer.replaceCurrentItemWithPlayerItem(nil)
    
  • 3

    SWIFT 3 Version:

    player.replaceCurrentItem(with: nil)
    

相关问题