2015-10-07 12 views
13

Aktualnie testuję użycie odtwarzacza AVP z adresem URL strumienia audio, używając Swift. Istnieją metody play() i pause(), ale problem polega na tym, że tylko pauza pozostaje w pamięci podręcznej w urządzeniu.Nie można zatrzymać odtwarzacza AVPlayer

Tu jest mój kodu testu:

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() 
    } 
} 

Oto problemy, gdy próbuje latków:

player = nil: „nie można przypisać wartość typu«NilLiteralCOnvertible»do wartości typu„AVPlayer ""

player.currentItem = nil: "Nie można przypisać do właściwości:" currentItem "to właściwość tylko do pobrania"


Próbowałem wszystkiego, nawet przez AVQueuePlayer, bez żadnych skutecznych rezultatów. (oczywiście, ponieważ mam tylko jeden przedmiot w moim przypadku).

How to zatrzymać AVPlayer lub zniszczyć jego instancję?

+1

'gracz = zero' lub 'player.currentItem = nil'? – JAL

+0

@JAL, 'player' jest instancją AVPlayera, więc nie mogę tego po prostu zrobić. Proszę zobaczyć funkcję 'stopPlayer()', testowałem już to – Zl3n

+0

Jaki błąd pojawia się przy próbie ustawienia odtwarzacza na zero? Czy próbowałeś usunąć bieżący element gracza, tak jak sugerowałem? – JAL

Odpowiedz

9

Jeśli zadeklarujesz player jako opcjonalną zmienną, możesz ustawić odtwarzacz na nil, aby zwolnić go.

Głupi przykład, ale pokazuje, co się dzieje:

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") 
     } 
    } 
} 
+0

Dziękuję za odpowiedź. Jestem pewien, że twoje rozwiązanie działa, ale jak to zrobić, gdy ponownie włączysz funkcję 'initPlayer()'? – Zl3n

+0

'player = AVPlayer (URL: NSURL (ciąg:" http://streaming.radio.rtl.fr/rtl-1-48-192 ")!)'. Pamiętaj, że ta odpowiedź jest po prostu * głupim * przykładem, który pokazuje, że możesz ustawić gracza na zero. To nie jest samouczek dotyczący prawidłowego korzystania z odtwarzacza. ;) – Moritz

+2

Zaktualizowałem mój przykład. – Moritz

18

Od tego post znalazłem najlepsze rozwiązanie, aby całkowicie zatrzymać AVPlayer przed wyjazdem lub rozpocząć nowy zawodnik:

videoPlayer.replaceCurrentItemWithPlayerItem(nil) 
+0

To jest poprawna odpowiedź. Zaakceptuj odbierającego za Twoją zgodą. –

+0

Czy wiesz, jak odtwarzać kontynuację dźwięku po zniszczeniu tego kontrolera ViewController po utworzeniu instancji odtwarzacza AVPlayer. –

+0

To działa! Dla swift3: videoPlayer.replaceCurrentItem (z: nil) – BenHedges

0

SWIFT 3 Wersja:

player.replaceCurrentItem(with: nil) 
Powiązane problemy