我有一个AVPlayer正在流式传输一段直播HLS流。
当用户多任务时,我看到播放速率下降到0.0(暂停),当用户返回时,它返回到1.0(播放),但从暂停的点开始播放。
有什么最好的方法可以强制播放器回到实时状态而不完全重新启动流吗?是否有一个seekToTime方法,可以处理最接近实时时间的参数?
谢谢!
我有一个AVPlayer正在流式传输一段直播HLS流。
当用户多任务时,我看到播放速率下降到0.0(暂停),当用户返回时,它返回到1.0(播放),但从暂停的点开始播放。
有什么最好的方法可以强制播放器回到实时状态而不完全重新启动流吗?是否有一个seekToTime方法,可以处理最接近实时时间的参数?
谢谢!
我使用:
double time = MAXFLOAT;
[player seekToTime: CMTimeMakeWithSeconds(time, NSEC_PER_SEC)];
在我的应用程序中表现良好。
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)];
player.seek(to: kCMTimePositiveInfinity)
player.play()
Swift 3.0 版本
public func resumeLive() {
guard let livePosition = player.currentItem?.seekableTimeRanges.last as? CMTimeRange else {
return
}
player.seek(to:CMTimeRangeGetEnd(livePosition))
}
卡里姆·穆拉的答案的Swift版本:
let seekableRanges = player.currentItem!.seekableTimeRanges
guard seekableRanges.count > 0 else {
return
}
let range = seekableRanges.last!.CMTimeRangeValue
let livePosition = range.start + range.duration
let minus = CMTimeMakeWithSeconds(Float64(timeOffset), Int32(NSEC_PER_SEC))
let time = livePosition - minus
player.seekToTime(time)
return;
}player.seekToTime(lastRange.end) - FabianlivePosition
,并省略带有 timeOffset
的那一行代码。 - davidgoli如果使用苹果的CMTimeRange
操作函数,则无需将其转换为浮点数:
NSValue *value = player.currentItem.seekableTimeRanges.lastObject;
if (value) {
CMTimeRange seekableRange = [value CMTimeRangeValue];
CMTime latestTime = CMTimeRangeGetEnd(seekableRange);
[player seekToTime:latestTime];
} else {
// there are no seekable time ranges
}
Swift 4 版本:
if let seekableRange = player.currentItem?.seekableTimeRanges.last?.timeRangeValue {
let seekableStart = seekableRange.start
let seekableDuration = seekableRange.duration
let livePosition = seekableStart + seekableDuration
player.seek(to: livePosition, completionHandler: { [weak self] _ in
self?.player.play()
})
}