【问题标题】:Resuming play of live video stream after AVPlayerItemFailedToPlayToEndTime在 AVPlayerItemFailedToPlayToEndTime 后恢复播放实时视频流
【发布时间】:2017-08-03 07:05:11
【问题描述】:

如果 HLS 的服务器端(播放列表)发生错误,AVPlayer 客户端最终将停止,我们将收到此通知:AVPlayerItemFailedToPlayToEndTime。

我们如何才能在这之后恢复游戏,理所当然地认为服务器端的所有错误都已修复?

  • 我在播放列表端导致 500 错误。 AVPlayer 会在一段时间后停止。

  • 即使发生了 AVPlayerItemFailedToPlayToEndTime,AVPlayer 的状态也不是failed,currentItem.status 也不是failed。具体来说,这两个仍然是readyToPlay,看起来我们应该能够在不重新创建整个 AVPlayer 实例等的情况下继续播放。

  • 我尝试再次引起“播放”的方式是self.play()(AVPlayer 的子类)。这不起作用。

  • 我已经能够通过重新创建 AVPlayerItem 并使用 replaceCurrentItem() 再次分配它来恢复播放(从失败状态)。但是,由于我需要在没有任何用户交互(例如按下播放按钮等)的情况下发生这种情况,因此似乎没有好的方法来找出何时应用此方法,以及它是否真的有效。

    李>

【问题讨论】:

  • 跟踪媒体播放的时间,以防服务器故障重播媒体再次转发到该时间。
  • 是的,使 timeCount Var 类级别,并使用链接中的方法定期调用将其增加一。所以现在时间将保存在你的变量中,用它来寻找 avplayer 的时间。
  • 我看不出这有什么关系。无论如何,似乎 AVPlayer 的行为是在服务器错误(500s)在一定程度上失败后停止尝试下载更多片段。似乎我们必须再次重新创建 AVPlayerItem 才能重试。此外,何时这样做似乎是一个高度相关但又不同且有问题的问题。我需要找出播放无限期停止的时间,并找到某种时机重试。我会假设 AVPlayer 为我们做这件事,但它似乎在某个时候放弃了所有尝试。 ??????

标签: ios avplayer http-live-streaming


【解决方案1】:

我认为您需要节省暂停时间。每当您再次播放视频时,说“播放按钮单击”或“恢复视频”,寻找那个时间

avPlayer.seek(to: playerPauseTime)

if self.avPlayer.status == .readyToPlay && self.avPlayer.currentItem?.status == .readyToPlay {

        self.avPlayer.seek(to: atTime,
                           toleranceBefore: kCMTimeZero,
                           toleranceAfter: kCMTimeZero,
                           completionHandler: { (finished) in

                            self.avPlayer.play()
        })
    }

您将从暂停的时间间隔开始播放视频。

【讨论】:

  • 我不确定你所说的暂停时间是什么意思,用户不能故意暂停。另外,这是一个直播,所以我不确定搜索是否有任何意义。
  • FWIW,我暂时尝试了这个:总是使用寻求“零”时间来恢复。但是,如果在播放列表端发生 500 个错误后 avplayer 处于“坏”状态,则 seek 调用永远不会结束。
猜你喜欢
  • 2020-02-26
  • 2014-07-21
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多