为啥 Swift 的 AVPlayer 一次播放会加载 playerItem 两次?

Posted

技术标签:

【中文标题】为啥 Swift 的 AVPlayer 一次播放会加载 playerItem 两次?【英文标题】:Why does Swift's AVPlayer loads the playerItem for twice on one play?为什么 Swift 的 AVPlayer 一次播放会加载 playerItem 两次? 【发布时间】:2016-05-16 00:02:08 【问题描述】:

我正在使用 AVFoundation 的 AVPlayer 流式传输外部 mp3 文件。我在后端有一个计数器,用于计算文件加载的次数。该服务的唯一客户端只有我,每当我触发播放 AVPlayer 时,计数器都会增加 2,这意味着 AVPlayer 会发出两次请求。这是有原因的,或者我怎样才能防止这种情况发生?这是我的代码:

@IBAction func listen(sender: UIButton) 
    let urlstring = "http://api.server.com/endpoint-to-mp3"
    let url = NSURL(string: urlstring)

    let playerItem = AVPlayerItem(URL: url!)

    let player = AVPlayer(playerItem: playerItem)

    let playerLayer = AVPlayerLayer(player: player)
    playerLayer.frame = CGRectMake(0, 0, 300, 50)
    self.view.layer.addSublayer(playerLayer)

    player.volume = 1.0
    player.play()

【问题讨论】:

您知道发出了哪些类型的请求吗?一个是仅标头请求,另一个是实际数据吗? 【参考方案1】:

每当您使用AVPlayerItem 初始化播放器时,AVPlayer 都会向URL 发出网络请求。此调用仅获取文件信息和文件大小。 (此时我可以观察到 2 个请求,这可能会将您的计数增加到 3 个)

稍后,当您将播放器附加到任何视图时,会发生另一个调用以获取完整文件。 (您可以使用Charles 观察您的网络流量,仅供参考)

当你init 玩家init(url:) 时,这种行为是相同的,所以我看不出有任何方法可以阻止这种情况发生。

【讨论】:

很好的答案!感谢您的描述性如此之好,并感谢查尔斯的提示。 ;)

以上是关于为啥 Swift 的 AVPlayer 一次播放会加载 playerItem 两次?的主要内容,如果未能解决你的问题,请参考以下文章

在 IOS 9 上使用 AVPlayer 和 Swift 反向播放视频

AVPlayer 自动播放但不应该(Swift)

AVPlayer 不播放 URL 声音 Swift 3

在 AVPlayer [Swift] 中播放 MPMediaItemCollection 中的项目

Swift 2 AVPlayer - 播放下一个视频 上一个视频

Swift,如何在 AVPlayer 上播放视频期间获得事件点击完成按钮?