如何在avplayer中获得实时流媒体的准确时间位置

Ray*_*hen 5 http-live-streaming ios avplayer

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

Hsi*_*ing 9

快速解决方案:

   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;
}
Run Code Online (Sandbox Code Playgroud)


Kos*_*val 8

要获得现场位置毒药,利用寻求它,你可以seekableTimeRanges的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)];
Run Code Online (Sandbox Code Playgroud)

此外,当您寻求回溯时,您可以通过调用currentTime方法获取当前播放位置

CGFloat current = CMTimeGetSeconds([self.player.currentItem currentTime]);
CGFloat diff = livePosition - current;
Run Code Online (Sandbox Code Playgroud)


小智 5

我知道这个问题很旧,但我有同样的要求,并且我相信解决方案没有正确解决问题的意图。

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

在进一步讨论之前,我将解释一些内容,当前时间点可能会超过(开始时间 + 总持续时间),这是由于 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
Run Code Online (Sandbox Code Playgroud)

上面的代码将为您提供一个负数,其中包含“live”后面的秒数,或更具体地说是最新 ts 段的开始时间。或者在播放最新的 ts 片段时为正数或零。

说实话,我真的不知道eekableTimeRanges什么时候会有超过1个值,对于我测试过的流来说它一直只是一个值,但是如果你在你的流中发现超过1个值,你可能需要弄清楚如果你想要添加所有范围持续时间、用作起始值的时间范围等。至少对于我的用例来说,这已经足够了。