簡體   English   中英

iOS 上的 HLS AVPlayer - 回歸直播

[英]HLS AVPlayer on iOS - return to live

我有一個 AVPlayer 正在流式傳輸實時 HLS 流。

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

在不完全重新啟動流的情況下強制播放器恢復活動的最佳方法是什么? 是否有處理最接近實時時間參數的 seekToTime 方法?

謝謝!

我用:

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

在我的應用程序中運行良好。

假設 player 是一個 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)];

Igor Kulagin的 Swift 版本回答:

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

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

斯威夫特 3.0 版本

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

快速版本的 Karim 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)

如果您使用 Apple 的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
}

請參閱下面的@Fabian 評論

斯威夫特 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()
    })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM