我正在使用AVPlayer播放直播。这个流支持一小时的追赶,这意味着用户可以在一小时前寻找并玩游戏。但我有一个问题,我怎么知道玩家正在玩的准确位置。我需要在播放器视图上显示当前位置。例如,如果用户在半小时前播放,则显示-30:00;如果用户正在播放最新内容,则播放器将显示00:00或直播。感谢
答案 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的值,则可能必须计算是否要添加所有范围的持续时间,将哪个时间范围用作起始值等。至少对于我的用例来说,这就足够了。