現在、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を停止する方法または彼のインスタンスを破棄する方法
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)
プレーヤーを初期化するときに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
}
}