如何在avplayer

时间:2016-04-07 02:44:26

标签: ios avplayer http-live-streaming

我正在使用AVPlayer播放直播。这个流支持一小时的追赶,这意味着用户可以在一小时前寻找并玩游戏。但我有一个问题,我怎么知道玩家正在玩的准确位置。我需要在播放器视图上显示当前位置。例如,如果用户在半小时前播放,则显示-30:00;如果用户正在播放最新内容,则播放器将显示00:00或直播。感谢

3 个答案:

答案 0 :(得分:3)

快速解决方案:

   override func getLiveDuration() -> Float {
    var result : Float = 0.0;

    if let items = player.currentItem?.seekableTimeRanges {

        if(!items.isEmpty) {
            let range = items[items.count - 1]
            let timeRange = range.timeRangeValue
            let startSeconds = CMTimeGetSeconds(timeRange.start)
            let durationSeconds = CMTimeGetSeconds(timeRange.duration)

            result = Float(startSeconds + durationSeconds)
        }

    }
    return result;
}

答案 1 :(得分:2)

要获得实时位置毒药,并使用seekableTimeRanges的{​​{1}}来查找它:

AVPlayerItem

此外,当您寻找一些时间时,您可以通过调用CMTimeRange seekableRange = [player.currentItem.seekableTimeRanges.lastObject CMTimeRangeValue]; CGFloat seekableStart = CMTimeGetSeconds(seekableRange.start); CGFloat seekableDuration = CMTimeGetSeconds(seekableRange.duration); CGFloat livePosition = seekableStart + seekableDuration; [player seekToTime:CMTimeMake(livePosition, 1)]; 方法

来获取当前的比赛位置
currentTime

答案 2 :(得分:1)

我知道这个问题很旧,但是我有相同的要求,并且我认为解决方案不能正确解决问题的意图。

对于相同的要求,我要做的是收集当前时间点,开始时间和流总持续时间的长度。

在进一步说明之前,我将进行解释,当前时间点可能会超过(开始时间+总持续时间),这是由于hls构造为ts段的方式所致。 Ts片段是可播放视频的小片段,您可以在可搜寻范围内将5 ts片段各10秒。这并不意味着实时流的整个长度为50秒,更多的是整个片段(因此总播放时间为60秒),但是由于您不应该搜索该片段,因此不能将其归类为可搜索。如果要执行此操作,您会在大多数情况下注意到重新缓冲(因为当您已经到达播放结束时,源可能仍在创建下一个ts片段)。

我所做的是检查当前播放时间是否比可搜索的怒气还要长,如果是,则表示正在直播。如果不是,那么减去当前时间,开始时间和总持续时间,您就可以轻松计算出离实时有多远。

let timeRange:CMTimeRange = player.currentItem?.seekableTimeRanges.last
let start = timeRange.start.seconds
let totalDuration = timeRange.duration.seconds
let currentTime = player.currentTime().seconds
let secondsBehindLive = currentTime - totalDuration - start

上面的代码将为您提供一个负数,表示“实时”后面的秒数,或更确切地说是最后一个ts段的开始时间。播放最新的ts片段时为正数或零。

我暂时不知道seekableTimeRanges何时会具有多个值,对于我测试过的流,它始终只是一个值,但是如果您在流中发现大于1的值,则可能必须计算是否要添加所有范围的持续时间,将哪个时间范围用作起始值等。至少对于我的用例来说,这就足够了。