tvOS-实时视频流由于playingBufferEmpty而停止,并且永远不会恢复

时间:2018-12-21 03:10:22

标签: ios avplayer tvos playback avplayerviewcontroller

我正在使用默认的AVPlayerController在我的tvOS中播放视频。 [tvOS 12.1.1]

有时由于不良的网络或带宽问题,由于playingBufferEmpty,视频停止播放。

在那种情况下,我观​​察到

  1. playbackLikelyToKeepUp = false
  2. playbackBufferFull =假
  3. playbackBufferEmpty = true
  4. 玩家收视率为0.0
  5. playerView timeControlStatus已暂停
  6. playerViewForForWaitingToPlay的原因是AVPlayerWaitingToMinimizeStallsReason

此后,即使带宽恢复,视频也会冻结并且无法恢复播放。

这是播放器的错误,还是我们需要以编程方式触发以恢复视频停止播放?

一旦playbackBuffer为空,我将调用此函数handleBufferEmptyCase()

即使在调用此函数之后,我仍然观察到视频仍然暂停并且无法恢复。 在视频冻结时观察到的情况,如果我尝试播放另一个视频,则视频播放至少45分钟没有任何中断,然后再次冻结了视频。 我有足够的带宽来播放直播。

代码段:

func observeCurrentPlayingVideo() {
    if currentItem.status == AVPlayerItem.Status.readyToPlay {
        if currentItem.isPlaybackLikelyToKeepUp {

        } else if currentItem.isPlaybackBufferEmpty {

            print("LiveVC | isPlaybackBufferEmpty...")
            perform(#selector(handleBufferEmptyCase), with: nil, afterDelay: 2)

        }  else if currentItem.isPlaybackBufferFull {

        }

    } if currentItem.status == AVPlayerItem.Status.failed {

    }
}


func handleBufferEmptyCase() {
        if let currentItem = self.playerView.currentItem {
            if currentItem.isPlaybackBufferEmpty && !currentItem.isPlaybackLikelyToKeepUp && playerView.rate != 1 && playerView.timeControlStatus == .paused {
            print("handleBufferEmptyCase | Triggering to play again...")
            self.playerView.pause()
            self.playerView.play()
        }
    }
}

我的期望是继续播放,并确保即使在bufferEmpty发生后,视频仍能继续播放。

1 个答案:

答案 0 :(得分:0)

实际上,当mainValue = float(str) gives me 7.515e-05 output. mainValue =Decimal(str) gives me 0.0 output 由于连接不良而停止播放时,function getFriendlyResult(k, input) { var output = {}; for (var key in input) { if (key !== k) output[key] = input[key]; } for (var innerKey in input[k]) output[innerKey] = input[innerKey]; return output; 的状态为失败。您必须创建一个新的AVPlayer对象并使用AVPlayerItem AVPlayerItem方法。

了解玩家“状态”的相关方法是检查相关的replaceCurrentItem(with:)费率。 0表示玩家已停止。比率!= 0表示玩家正在玩。

另外,使用AVPlayer的通知来检测出错误之处:

  • AVPlayerItemPlaybackStalled
  • AVPlayerItemFailedToPlayToEndTime
  • AVPlayerItemDidPlayToEndTime(可在缓冲区为空网络不可用时触发)

此iOS库ModernAVPlayer可帮助您了解该过程。 检查AVPlayerItem文件和相关服务。