2012-10-30 13 views
6

Ich habe einen AVPlayer, der einen Live-HLS-Stream streamt.HLS AVPlayer auf iOS - zurück zum Leben

Wenn der Benutzer die App Multitasking, sehe ich die Play-Rate auf 0.0 (pausiert), wenn der Benutzer kommt zurück zu 1.0 (Wiedergabe), aber beginnt ab dem Zeitpunkt zu spielen.

Was ist der beste Weg, um den Player zum Leben zu zwingen, ohne den Stream vollständig neu zu starten? Gibt es eine seekToTime-Methode, die den Parameter "Am nächsten zur Live-Zeit" verarbeitet?

Danke!

Antwort

7

Ich benutze:

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

Funktioniert gut in meiner app.

+0

Ja, es funktioniert mir! –

1

Angenommen Spieler ist ein AVPlayer Beispiel:

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

Dies ist die echte Antwort. Arbeitete für mich wie ein Zauber. – davidgoli

+0

Sie können auch CMTimeAdd anstelle des Konvertierens in Fließkommazahl verwenden –

+3

Sie können CMTimeRangeGetEnd auch verwenden, anstatt die Dauer zum Start hinzuzufügen. – Fabian

0

Swift-Version von Karim Mourra Antwort:

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

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

+0

Was ist "timeoffset"? –

+0

@HongZhou ist es ein vollständig optionaler Puffer in Sekunden. Sie können einfach 'livePosition' verwenden und die Zeile mit' timeOffset' weglassen. – davidgoli

0

Keine Notwendigkeit, Floating-Point zu konvertieren, wenn Sie CMTimeRange Funktionen Manipulation von Apple verwenden:

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 
} 

EDIT: bitte upvote Fabian Kommentar unter

+2

Keine Notwendigkeit, Zeit hinzuzufügen, wenn Sie CMTimeRangeGetEnd verwenden – Fabian

+0

Danke, Fabian! –

1

Swift 3.0 Version

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

Swift-Version Igor Kulagin Antwort:

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

funktioniert perfekt in jedem Zustand. Andere Lösungen gaben mir NaN Fehler Berechnung livePosition Wert oder {INVALID} Fehler funktioniert direkt mit CMTime.