7

ライブ HLS ストリームをストリーミングしている AVPlayer があります。

ユーザーがアプリをマルチタスクすると、再生率が 0.0 (一時停止) に低下し、ユーザーが戻ると 1.0 (再生) に戻りますが、一時停止した時点から再生を開始します。

ストリームを完全に再開せずにプレーヤーを強制的にライブに戻す最良の方法は何ですか? 最も近いライブ時間パラメータを処理する seekToTime メソッドはありますか?

ありがとう!

4

7 に答える 7

8

私が使う:

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

私のアプリではうまく機能します。

于 2012-12-15T13:43:24.987 に答える
3

プレーヤーが 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)];
于 2015-11-19T02:05:38.793 に答える
0

CMTimeRangeApple の操作関数を使用する場合、浮動小数点に変換する必要はありません。

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
}

編集:以下のファビアンのコメントに賛成票を投じてください

于 2016-03-30T18:40:52.970 に答える
0

カリム・モウラの答えの迅速なバージョン:

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)
于 2016-03-29T00:36:17.567 に答える
0

スウィフト 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()
    })
}
于 2020-04-30T20:45:16.207 に答える