ライブ HLS ストリームをストリーミングしている AVPlayer があります。
ユーザーがアプリをマルチタスクすると、再生率が 0.0 (一時停止) に低下し、ユーザーが戻ると 1.0 (再生) に戻りますが、一時停止した時点から再生を開始します。
ストリームを完全に再開せずにプレーヤーを強制的にライブに戻す最良の方法は何ですか? 最も近いライブ時間パラメータを処理する seekToTime メソッドはありますか?
ありがとう!
ライブ 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)];
CMTimeRange
Apple の操作関数を使用する場合、浮動小数点に変換する必要はありません。
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
}
編集:以下のファビアンのコメントに賛成票を投じてください
カリム・モウラの答えの迅速なバージョン:
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)
スウィフト 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()
})
}