【问题标题】:Strange behavior of AVPlayerAVPlayer 的奇怪行为
【发布时间】:2018-02-05 02:31:23
【问题描述】:

在使用 AVFoundation 框架中的 AVPlayer 时,我注意到一个非常奇怪的行为。我正在尝试从 Internet 流式传输(播放)一些 mp3 广播文件。

于是我在 Xcode 中新建了一个项目,并将以下代码添加到默认的 ViewController 中:

import UIKit
import AVFoundation

class ViewController: UIViewController {

    let player: AVPlayer = AVPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()

        let asset = AVAsset(url: URL(string: "https://rfcmedia.streamguys1.com/Newport.mp3")!);
        let playerItem = AVPlayerItem(asset: asset);
        player.replaceCurrentItem(with: playerItem)
        player.play();
    }
}

那里没有什么特别有趣的事情发生。我只是用广播电台的 URL 创建了一个 AVPlayerItem 实例并将其提供给 AVPlayer,然后让播放器对象播放这首歌,它就像预期的那样工作。

但是,如果我从类块中删除 player 对象实例化并将其放入 viewDidLoad 方法中,则代码根本不起作用(不播放任何内容)但它不会崩溃或吐出任何类型的错误或警告。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let player: AVPlayer = AVPlayer()
        let asset = AVAsset(url: URL(string: "https://rfcmedia.streamguys1.com/Newport.mp3")!);
        let playerItem = AVPlayerItem(asset: asset);
        player.replaceCurrentItem(with: playerItem)
        player.play();
    }
}

我无法理解这种行为。为什么会这样?它仅限于 AVPlayer 还是我应该注意这种情况?

【问题讨论】:

  • @AndreaMugnaini 你能解释一下吗?这些东西有什么关系?
  • 在你的第二个例子中,player 将在 viewDidLoad 执行后被释放,因为没有人指向这样的实例。因此,当您分配播放器时,保留计数变为 1,然后在 viewDidLoad 之后变为 0。在第一个示例中,保留计数为 1 并保持为 1,因为此类播放器是 ViewController 的存储属性,它保留了 player(直到未被释放,在这种情况下,player 也应该被释放)
  • @AndreaMugnaini 那么我如何确保player 在我的应用程序的整个生命周期中都是安全的?因为音乐播放器即使在后台也应该继续工作。
  • 我不知道您的应用程序的结构如何,请确保将此类 player 保存在“安全”的地方(可能是 ViewController

标签: ios swift xcode avfoundation avplayer


【解决方案1】:

正如 Andrea Mugnaini 在我的帖子的 cmets 中解释的那样,我的第二个示例将导致 ARC(自动引用计数)立即解除分配,而我们没有这样做' t 保持对 AVPlayer 对象的强引用

对于刚接触 Apple 生态系统的开发者来说,这是一个常见的陷阱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2015-07-20
    • 2010-10-03
    • 2021-07-12
    相关资源
    最近更新 更多