我遇到了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
}