2016-04-12 14 views
0

Ich weiß, es gibt eine Reihe von Posts, aber keiner von ihnen geholfen. Ich habe Videos mit verschiedenen FPS (wenn es irgendwie darauf ankommt) über mein Gerät. Ich berechne die genaue CMTime (wenn wir sie in Sekunden übersetzen werden sie 10.33333,10,4444 etc.). Ich suche diesen Code verwenden:SeekToTime funktioniert reibungslos nur für Forwards, Freezy auf Rückwärts

self.player.seekToTime(time, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) 

Es läuft nur reibungslos nach vorne, aber nach hinten ist es nicht. Irgendwelche Ideen warum?

Antwort

1

Dies ist aufgrund der Tatsache, dass komprimiertes Video mit "Schlüssel-Frames funktioniert. Ein Keyframe ist ein vollständig gerenderter Videoframe, aber nicht jeder Frame ist ein Keyframe. Frames, die einem Schlüsselbild folgen, werden nur als inkrementelle Unterschiede zu diesem Schlüsselbild gespeichert. Das heißt, wenn Sie sich durch das Video bewegen, zeigt der Player einen Keyframe an, springt zum nächsten Frame und zeichnet die Änderungen auf, bewegt sich zum nächsten Frame, usw. Wenn Sie sich rückwärts durch das Video bewegen, können Sie nur den Player anzeigen sind die Schlüsselbilder. Normalerweise verwendet es die codierten Daten, um den Schlüsselframe plus ein paar Frames NACH dem Schlüsselbild anzuzeigen, so dass Sie sehen können, was an diesem Punkt im Video passiert. Der einzige Weg, um das Video in einen Puffer zu dekomprimieren und zurück zu scannen - aus offensichtlichen Gründen ist dies für die meisten Zwecke zu langsam.

http://www.dacast.com/blog/what-is-a-key-frame-for-video/

0

Versuchen Sie, diese Hoffnung

 let timeScale: Int32 = (self.playerController1.player?.currentItem!.asset.duration.timescale)! 

    let time: CMTime = CMTimeMakeWithSeconds(77.000000, timeScale) 

    self.playerController1.player?.seekToTime(time,toleranceBefore:kCMTimeZero ,toleranceAfter:kCMTimeZero) 
+0

Hey Ankit. Es ist immer noch auf rückwärts: \ –

1

Wenn Sie seekToTime rufen, wird der Spieler Artikel vorherigen abbrechen sucht im Gange, was zu viel suchen und nicht viel Frame-Anzeige. Verwenden Sie eine bool var isSeekInProgress, um anzuzeigen, wenn der Spieler Artikel sucht oder nicht.

Lassen Sie wie folgt versuchen:

var isSeekInProgress = false 
let player = <#A valid player object #> 
var chaseTime = kCMTimeZero 
// your player.currentItem.status 
var playerCurrentItemStatus:AVPlayerItemStatus = .Unknown 

... 

func stopPlayingAndSeekSmoothlyToTime(newChaseTime:CMTime) 
{ 
    player.pause() 

    if CMTimeCompare(newChaseTime, chaseTime) != 0 
    { 
     chaseTime = newChaseTime; 

     if !isSeekInProgress 
     { 
      trySeekToChaseTime() 
     } 
    } 
} 

func trySeekToChaseTime() 
{ 
    if playerCurrentItemStatus == .Unknown 
    { 
     // wait until item becomes ready (KVO player.currentItem.status) 
    } 
    else if playerCurrentItemStatus == .ReadyToPlay 
    { 
     actuallySeekToTime() 
    } 
} 

func actuallySeekToTime() 
{ 
    isSeekInProgress = true 
    let seekTimeInProgress = chaseTime 
    player.seekToTime(seekTimeInProgress, toleranceBefore: kCMTimeZero, 
      toleranceAfter: kCMTimeZero, completionHandler: 
    { (isFinished:Bool) -> Void in 

     if CMTimeCompare(seekTimeInProgress, chaseTime) == 0 
     { 
      isSeekInProgress = false 
     } 
     else 
     { 
      trySeekToChaseTime() 
     } 
    }) 
} 

Für weitere Informationen: https://developer.apple.com/library/content/qa/qa1820/_index.html