如何在avplayer中获得直播的准确时间位置



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

Swift解决方案:

   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;
}

要获得实弹位置毒药并找到它,可以使用AVPlayerItem:的seekableTimeRanges

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方法来获得当前的播放位置

CGFloat current = CMTimeGetSeconds([self.player.currentItem currentTime]);
CGFloat diff = livePosition - current;

我知道这个问题很老,但我有同样的要求,我认为解决方案没有正确解决问题的意图。

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

在进一步讨论之前,我会解释一下,当前时间点可能超过(开始时间+总持续时间),这是由于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片段时为正数或零。

Tbh我真的不知道seekableTimeRanges什么时候会有超过1的值,它一直只是我测试过的流的一个值,但如果你在流中发现超过1个值,你可能必须考虑是否要添加所有的范围持续时间,使用哪个时间范围作为起始值,等等。至少对我的用例来说,这已经足够了。

相关内容

  • 没有找到相关文章

最新更新