2015-10-07 16 views
13

Tôi hiện đang thử nghiệm sử dụng AVPlayer với url phát âm thanh, sử dụng Swift. Có các phương thức play()pause() nhưng vấn đề là, tạm dừng chỉ, luồng vẫn được lưu trong bộ nhớ cache trong thiết bị.Không thể dừng AVPlayer

Đây là mã thử nghiệm của tôi:

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

Dưới đây là những vấn đề khi cố gắng somethings:

player = nil: "Không thể gán một giá trị của loại 'NilLiteralCOnvertible' đến một giá trị của loại 'AVPlayer '"

player.currentItem = nil:" Không thể chỉ định cho thuộc tính:' currentItem 'là thuộc tính chỉ nhận "


Tôi đã thử mọi thứ, ngay cả thông qua AVQueuePlayer mà không có bất kỳ kết quả hiệu quả nào. (hiển nhiên, vì tôi chỉ có một món trong trường hợp của tôi).

Cách dừng AVPlayer hoặc phá hủy dụ của mình?

+1

'player = nil' hoặc 'player.currentItem = nil'? – JAL

+0

@JAL, 'trình phát' là một phiên bản của AVPlayer, vì vậy tôi không thể làm điều đó. Xin vui lòng xem chức năng 'stopPlayer()', tôi đã kiểm tra điều này – Zl3n

+0

Lỗi nào bạn nhận được khi bạn cố gắng cài đặt trình phát thành nil? Ngoài ra, bạn đã thử xóa currentItem của trình phát như tôi đã đề xuất chưa? – JAL

Trả lời

9

Nếu bạn khai báo player làm biến tùy chọn, bạn có thể đặt trình phát thành nil để deallocate nó.

dụ Silly nhưng nó cho thấy những gì xảy ra:

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

Cảm ơn bạn đã trả lời. Tôi chắc rằng giải pháp của bạn hoạt động, nhưng làm thế nào để phân bổ lại trình phát khi nhập lại trong hàm 'initPlayer()'? – Zl3n

+0

'player = AVPlayer (URL: NSURL (chuỗi:" http://streaming.radio.rtl.fr/rtl-1-48-192 ")!)'. Hãy nhận biết câu trả lời này chỉ là một ví dụ * ngớ ngẩn * để cho bạn thấy rằng bạn thực sự có thể đặt một người chơi thành không. Nó không phải là một hướng dẫn về cách sử dụng đúng cách trình phát. ;) – Moritz

+2

Cập nhật ví dụ của tôi. – Moritz

18

Từ post này tôi tìm thấy giải pháp tốt nhất để hoàn toàn ngăn chặn AVPlayer trước khi bạn rời hoặc bắt đầu một cầu thủ mới:

videoPlayer.replaceCurrentItemWithPlayerItem(nil) 
+0

Đây là câu trả lời đúng. Vui lòng trao giải người trả lời với sự chấp thuận của bạn. –

+0

Bạn có biết làm thế nào để chơi tiếp tục âm thanh sau khi bị phá hủy mà ViewController trên chúng tôi đã tạo ra trường hợp của AVPlayer. –

+0

Công trình này hoạt động! Đối với swift3: videoPlayer.replaceCurrentItem (với: nil) – BenHedges

0

SWIFT 3 Phiên bản:

player.replaceCurrentItem(with: nil) 
Các vấn đề liên quan