AVPlayer,长时间停顿后恢复 = 故障
Posted
技术标签:
【中文标题】AVPlayer,长时间停顿后恢复 = 故障【英文标题】:AVPlayer, long pause followed by resume = glitch 【发布时间】:2013-10-11 18:10:16 【问题描述】:我将AVPlayer
用于实时音频流。如果我暂停播放器并继续播放,它会从中断的地方重新开始(这很棒)。除非播放器已暂停很长时间以致停止从网络获取新数据。在这种情况下,当播放恢复时,它首先播放所有缓冲的数据,然后切换到实时数据。
这真的很烦人。听起来你刚刚从上次停下的地方接了过来,但是,令人惊讶的是,你跳到了前面。从收听旧的暂停前缓冲区数据切换到收听新的实时音频很糟糕。
我想做的是,当暂停“长”时,释放AVPlayer
。这样,如果用户再次按下“播放”,他们只会获得新的实时音频,而不是旧的缓冲数据。我知道这意味着播放开始前会有延迟,但我认为这比我现在遇到的音频不连续要好。
我没有发现任何方法可以检测到这种情况。我以为我可以在当前的AVPlayerItem
上观察到playbackBufferFull
,但这似乎永远不会改变。即使 Instruments 显示没有传入网络流量,playbackBufferFull 仍然为 0。
目前我只是使用两分钟超时,即如果在两分钟内没有恢复播放,请释放 AVPlayer。如果用户稍后按下“播放”,则使用新播放器重新开始。实验上,两分钟似乎并不可怕,尽管实际上并不好。有没有更好的方法来做到这一点?
【问题讨论】:
【参考方案1】:根据我的经验,播放缓冲区总是缓冲 50 秒的音频。您可以测量缓冲区中的秒数,当它达到 50 秒时(或者更好的是,当它停止增加时),您就知道是时候放弃该玩家了。
【讨论】:
我也见过 50 秒,但我讨厌依赖一个未记录的值(我最终只花了两分钟,因为我想允许该值有一些松弛)。相反,也许,观察当前项目的loadedTimeRanges
值,如果它在 1-2 秒内没有变化,则假设缓冲已停止?以上是关于AVPlayer,长时间停顿后恢复 = 故障的主要内容,如果未能解决你的问题,请参考以下文章
在 exportAsynchronouslyWithCompletionHandler 中创建 AVPlayer 时,看到视频之前的长时间延迟