web-dev-qa-db-ja.com

AVPlayerを停止できません

現在、Swiftを使用して、オーディオストリーミングURLで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()
    }
}

何かを試すときの問題は次のとおりです:

player = nil:「タイプ 'NilLiteralCOnvertible'の値をタイプ 'AVPlayer'の値に割り当てることはできません」

player.currentItem = nil:「プロパティに割り当てることができません: 'currentItem'はget-onlyプロパティです」


AVQueuePlayer でも効果的な結果なしですべてを試しました。 (明らかに、私の場合はアイテムが1つしかないため)。

AVPlayerを停止する方法または彼のインスタンスを破棄する方法

21
Zl3n

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

これから post 私はあなたが新しいプレーヤーを離れるか、始める前にAVPlayerを完全に停止するための最良の解決策を見つけました:

videoPlayer.replaceCurrentItemWithPlayerItem(nil)

[更新] Swift 3:

player.replaceCurrentItem(with: nil)
36
taynguyen

Swift 3バージョン:

player.replaceCurrentItem(with: nil)
3
Krishna Kirana

プレーヤーを初期化するときにavplayer変数nilを宣言し、urlをavplayerに割り当てます。このコードが役に立つと思います。 @ayaioのコードも使用できます。

変更されたコードは次のとおりです。

uIKitをインポート

aVFoundationのインポート

クラスViewController:UIViewController {

let player = AVPlayer?]

@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(strUrl : String)  {
    player = AVPlayer(URL : URL(string : strUrl!)
    player.play()
}

func stopPlayer() { //For Pause
    player.pause()
    player = nil //Assign nil to player destroy player object
}

}

0
Nayan Bhut