我目前正在测试AVPlayer与音频流url的使用,使用Swift.有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:"无法将'NilLiteralCOnvertible'类型的值分配给'AVPlayer'类型的值"

player.currentItem = nil:"无法分配给属性:'currentItem'是仅获取的属性"


我什么都试过了,即使试了AVQueuePlayer次也没有任何效果.(显然,因为我的箱子里只有一件物品).

如何达到stop AVPlayerdestroy his instance

推荐答案

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

Swift相关问答推荐

如何分解阿拉伯字母?

它是RxSwift中直接用于可扩展视图的有效的可扩展BehaviorRelay值?

在Xcode SWIFT中运行用Ionic编写的函数

表视图插座单元测试失败

应该在ViewModel还是ViewController中使用"Task {}"?

Xcode创建GitHub仓库,但未推送所有文件

如何让飞机与 RealityKit 中的物体相撞

对齐时如何避免图像尺寸缩小

使用协议捕获 SwiftUI 视图

如何处理永远不会失败的 String.Encoding 初始化程序?

在视图中设置所有变量

使 struct 可散列?

在 Swift 框架中加载资源(例如故事板)

用 UIBezierPath 画一条线

Swift 中的 CommonHMAC

为 UIImagePicker 设置委托返回错误

Swift中字节数组的NSData

URLComponents.url 为零

<<错误类型>> 奇怪的错误

Swift performSegueWithIdentifier 不起作用