2012-10-30 35 views
6

我有一個正在流式傳輸實時HLS流的AVPlayer。iOS上的HLS AVPlayer - 返回生活

當用戶多任務處理應用程序時,我看到播放速率下降到0.0(暫停),當用戶回來時它返回到1.0(播放),但從暫停點開始播放。

什麼是最好的方式強制播放器重新生活而不重新啓動流完全?是否有seekToTime方法處理最接近實時時間參數?

謝謝!

回答

7

我用:

double time = MAXFLOAT; 
[player seekToTime: CMTimeMakeWithSeconds(time, NSEC_PER_SEC)]; 

在我的應用效果很好。

+0

是的,它適用於我! –

1

假設播放器是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)]; 
+0

這是真正的答案。爲我工作就像一個魅力。 – davidgoli

+0

您也可以使用CMTimeAdd而不是轉換爲浮點數 –

+3

您也可以使用CMTimeRangeGetEnd,而不是將持續時間添加到開始。 – Fabian

0

卡里姆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) 
+1

guard let lastRange = player.currentItem?.seekableRanges.last else { return; } player.seekToTime(lastRange.end) – Fabian

+0

什麼是「timeoffset」? –

+0

@HongZhou在幾秒鐘內它就是一個完全可選的緩衝區。您可以使用'livePosition'並使用'timeOffset'省略該行。 – davidgoli

0

沒有必要,如果你使用蘋果的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法比安的評論

+2

如果您使用CMTimeRangeGetEnd,則無需添加時間 – Fabian

+0

謝謝,Fabian! –

1

雨燕3.0版本

public func resumeLive() { 
    guard let livePosition = player.currentItem?.seekableTimeRanges.last as? CMTimeRange else { 
     return 
    } 
    player.seek(to:CMTimeRangeGetEnd(livePosition)) 
} 
0

斯威夫特版本Igor Kulagin答案:

player.seek(to: kCMTimePositiveInfinity) 
player.play() 

完美的作品在任何條件下。其他解決方案給我NaN錯誤計算livePosition值,或{INVALID}錯誤直接與CMTime工作。