在 AVPlayerItemFailedToPlayToEndTime 后恢复播放实时视频流
Posted
技术标签:
【中文标题】在 AVPlayerItemFailedToPlayToEndTime 后恢复播放实时视频流【英文标题】:Resuming play of live video stream after 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()
再次分配它来恢复播放(从失败状态)。但是,由于我需要在没有任何用户交互(例如按下播放按钮等)的情况下发生这种情况,因此似乎没有好的方法来找出何时应用此方法,以及它是否真的有效。
【问题讨论】:
跟踪媒体播放的时间,以防服务器故障重播媒体再次转发到该时间。 只是可能相关***.com/questions/19438095/… 是的,使 timeCount Var 类级别,并使用链接中的方法定期调用将其增加一。所以现在时间将保存在你的变量中,用它来寻找 avplayer 的时间。 ***.com/a/19142835/1242673 我看不出这有什么关系。无论如何,似乎 AVPlayer 的行为是在服务器错误(500s)在一定程度上失败后停止尝试下载更多片段。似乎我们必须再次重新创建 AVPlayerItem 才能重试。此外,何时这样做似乎是一个高度相关但又不同且有问题的问题。我需要找出播放无限期停止的时间,并找到某种时机重试。我会假设 AVPlayer 为我们做这件事,但它似乎在某个时候放弃了所有尝试。 ?????? 【参考方案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 调用永远不会结束。以上是关于在 AVPlayerItemFailedToPlayToEndTime 后恢复播放实时视频流的主要内容,如果未能解决你的问题,请参考以下文章
在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?