使用AVPlayerItem.loadedTimeRanges可能的错误跟踪缓冲区进度

时间:2017-02-27 19:10:48

标签: ios avqueueplayer

我遇到了AVQueuePlayer的一些奇怪问题。我将首先解释我的实现目的,然后回顾我遇到的问题。

正在运行:iPhone5s,iOS 10.1.1,LTE连接

视频:逐步下载视频。 .mp4,5mb,4秒持续时间。

实现的目的是播放逐步下载的无缝循环视频。视频不会包含任何声音。

我正在使用AVQueuePlayer(支持iOS 9及更高版本)来循环播放视频。我按照Apple推荐的方式进行设置。这是监听要更改的当前玩家项目,然后将玩家项目移动到队列的末尾。

https://developer.apple.com/library/content/samplecode/avloopplayer/Listings/Projects_VideoLooper_VideoLooper_QueuePlayerLooper_swift.html#//apple_ref/doc/uid/TP40014695-Projects_VideoLooper_VideoLooper_QueuePlayerLooper_swift-DontLinkElementID_11

我遇到了2个问题。

问题1:我的设计师给了我一个包含视频轨道和音轨的视频。持续时间是一样的。我可以通过检查当前播放器项loadedTimeRanges来跟踪缓冲区进度。但是,当视频循环时,它不是无缝的。所以我们尝试了一个没有音轨的视频,然后点击了第2期。

问题2:测试相同的视频,但此视频仅包含视频轨道。视频循环惊人。这是无缝的。但是,在检查loadedTimeRanges以跟踪缓冲区进度时,持续时间将保持为0,直到视频完全加载。然后,持续时间将报告视频的总持续时间。

Issue2是个bug吗?我也觉得奇怪的是,删除音轨会创建一个更加无缝的循环。

我在下面提供了用于检查秒缓冲的代码。请注意,如果playerItem.loadedTimeRanges.first.timeRangeValue不存在,它将返回持续时间0。我可以确认该值确实存在,并在测试这两个问题时正确返回持续时间。

public var secondsBuffered: Float64 {

    if let playerItem = self.player?.currentItem {

        if let loadedTimeRange = playerItem.loadedTimeRanges.first?.timeRangeValue {

            let duration: Float64 = CMTimeGetSeconds(loadedTimeRange.duration)

            return duration
        }
    }

    return 0
}

0 个答案:

没有答案