我有一個正在流式傳輸實時HLS流的AVPlayer。iOS上的HLS AVPlayer - 返回生活
當用戶多任務處理應用程序時,我看到播放速率下降到0.0(暫停),當用戶回來時它返回到1.0(播放),但從暫停點開始播放。
什麼是最好的方式強制播放器重新生活而不重新啓動流完全?是否有seekToTime方法處理最接近實時時間參數?
謝謝!
我有一個正在流式傳輸實時HLS流的AVPlayer。iOS上的HLS AVPlayer - 返回生活
當用戶多任務處理應用程序時,我看到播放速率下降到0.0(暫停),當用戶回來時它返回到1.0(播放),但從暫停點開始播放。
什麼是最好的方式強制播放器重新生活而不重新啓動流完全?是否有seekToTime方法處理最接近實時時間參數?
謝謝!
我用:
double time = MAXFLOAT;
[player seekToTime: CMTimeMakeWithSeconds(time, NSEC_PER_SEC)];
在我的應用效果很好。
假設播放器是AVPlayer實例:
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)];
卡里姆Mourra的回答斯威夫特版本:
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)
沒有必要,如果你使用蘋果的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
}
編輯:請upvote法比安的評論
如果您使用CMTimeRangeGetEnd,則無需添加時間 – Fabian
謝謝,Fabian! –
雨燕3.0版本
public func resumeLive() {
guard let livePosition = player.currentItem?.seekableTimeRanges.last as? CMTimeRange else {
return
}
player.seek(to:CMTimeRangeGetEnd(livePosition))
}
斯威夫特版本Igor Kulagin答案:
player.seek(to: kCMTimePositiveInfinity)
player.play()
完美的作品在任何條件下。其他解決方案給我NaN
錯誤計算livePosition
值,或{INVALID}
錯誤直接與CMTime
工作。
是的,它適用於我! –