2016-07-20 8 views
1

ich habe diesen Code:Swift AVPlayer seekToTime Ausgabe

let punto = sender.locationInView(self.barraVideo).x 
     let larghezzaImg : Double = Double((self.barraVideoInvisTocco?.frame.width)!) 

     let percTocco : Double = (100/larghezzaImg) * Double(punto) 

     let lunghezzaVideo : Double = Double(CGFloat((avPlayer?.currentItem?.asset.duration.value)!)/CGFloat(1000.0)); 
     let frameRate : Int32 = (avPlayer?.currentItem?.currentTime().timescale)! 

     let secondo : Float64 = Float64((lunghezzaVideo/100)*percTocco) 
     print("Val : \(secondo)"); 

     avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate)) 

     avPlayer?.play() 
     videoInPlay = true; 
     playPauseBtn!.image = UIImage(named: "iconaPausa.png")!; 

, dass ein x cordinate einen Hahn auf dem seekBar recive und das Video suchen. Der Code funktioniert mit Video-Logs, funktioniert aber sehr schlecht mit kurzen Videos. Wenn ich auf dem kurzen Video tippen suchen die AVPlayer nur in der Nähe der Anfang oder am Ende des Videos, nicht in der Mitte

Druck:

Val : 3.36008475976495 
Val : 7.14189817632069 
Val : 13.3303201306846 
Val : 3.70388597945183 
Val : 3.93308679257642 
Val : 3.24548435320265 
Val : 3.70388597945183 
Val : 18.8311396456748 
Val : 27.0823689181601 
Val : 40.1468152662618 
Val : 51.3776551093667 
Val : 17.2267339538027 
Val : 9.54850671412889 
Val : 23.4151559081666 
Val : 37.6256063218913 

Der val rappresents den richtigen Wert von Sekunden, wo i will nicht suchen. Entschuldigung für schlechtes Englisch, ich bin Italiener

Antwort

4

Für AVPlayer gibt es verschiedene Möglichkeiten, das Spiel suchen zu lassen Zeit;

player.seekToTime(<#time: CMTime#CMTime#>) 

für diese Methode wird Spieler schnell seekingTime suchen, aber nicht die genau sucht, wo die seekingTime ist, bedeutet es, wird es des seekingTime einige versetzt sein.

Apples Doc

Verwenden Sie diese Methode zu einem bestimmten Zeitpunkt für den aktuellen Spieler Artikel zu suchen.

Die Zeit, die gesucht wird, kann von der angegebenen Zeit für die Effizienz abweichen.

Für eine genaue Stichprobe siehe seekToTime: toleranceBefore: toleranceAfter :.

player.seekToTime(<#T##time: CMTime##CMTime#>, completionHandler: <#T##(Bool) -> Void#>) 

für diese Methode wird Spieler versuchen, schnell und auch seekingTime, mit dem Offset, Sie etwas mit completionHandler

Apples Doc

Verwenden Sie diese Methode, um zu suchen, tun können eine bestimmte Zeit für den aktuellen Spielergegenstand und Benachrichtigung, wenn der Suchvorgang abgeschlossen ist.

Der Abschluss-Handler für jede vorherige Anforderung suchen, die noch in Bearbeitung ist, wird sofort mit dem fertigen Parameter

auf NO gesetzt aufgerufen werden. Wenn die neue Anforderung ohne Unterbrechung durch eine andere Suchanforderung oder durch eine andere Operation abgeschlossen wird, wird der angegebene Beendigungshandler

mit dem endgültigen Parametersatz auf YES aufgerufen.

Wenn Sie suchen genauer möchten, verwenden Sie die folgende Methode anstelle

player.seekToTime(<#T##time: CMTime##CMTime#>, toleranceBefore: <#T##CMTime#>, toleranceAfter: <#T##CMTime#>) 

player.seekToTime(<#T##time: CMTime##CMTime#>, toleranceBefore: <#T##CMTime#>, toleranceAfter: <#T##CMTime#>, completionHandler: <#T##(Bool) -> Void#>) 

diese Methode erhalten Sie die Spieler, die auf bestimmte Zeit zu fragen, lassen Sie wird aber langsamer sein (gut ..meist in Abhängigkeit von aktuellen Medien)

Apples Doc

Verwenden Sie diese Methode zu einem bestimmten Zeitpunkt für den aktuellen Spieler Artikel zu suchen.

Die gesuchte Zeit liegt innerhalb des Bereichs [Zeittoleranz vor, Zeit + Toleranznach] und kann von der angegebenen Zeit für die Effizienz abweichen.

Übergeben Sie kCMTimeZero sowohl für die Toleranz vor als auch für die Toleranz. Nach der Abfrage einer sample-genauen Suche, die eine zusätzliche Dekodierungsverzögerung verursachen kann.

Messaging dieser Methode mit beforeTolerance: kCMTimePositiveInfinity und afterTolerance: kCMTimePositiveInfinity ist identisch mit messaging seekToTime: direkt.

merke ich habe die aktuellen Sie

avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate)) 

Sie verwenden können versuchen, diese Methode zu verwenden, um die angegebene Zeit der Suche nach (langsamer natürlich)

avPlayer?.currentItem?.seekToTime(CMTimeMakeWithSeconds(secondo, frameRate), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) 

wünschen könnte u helfen

1

Ich bezweifle, dass eine der Antworten tatsächlich funktioniert. Versuchen Sie dies:

Technische Q & A QA1820 Wie erreiche ich glatte Video Scrubbing mit AVPlayer seekToTime :?

F: Meine App ermöglicht dem Benutzer das Scrubben von Videodateien mithilfe eines Schiebereglers in Kombination mit AVPlayer seekToTime: Die Anzeige der Videoframes weist jedoch eine erhebliche Verzögerung auf. Wie kann ich sanfteres Scheuern erreichen?

A: Vermeiden Sie es, Anrufe zum AVPlayer seekToTime zu tätigen: in schneller Folge. Dadurch werden die laufenden Suchvorgänge abgebrochen, was zu einer Menge Suchvorgänge und nicht zu einer großen Anzeige der Zielframes führt. Verwenden Sie stattdessen die Completion-Handler-Variante von AVPlayer seekToTime: und warten Sie, bis ein Suchvorgang abgeschlossen ist, bevor Sie einen anderen Vorgang ausführen. Listing 1 und Listing 2 zeigen Beispiele für diese Technik (Hinweis: In diesen Beispielen wird angenommen, dass ein gültiges Spielerobjekt erstellt wurde und der aktuelle Gegenstandsstatus des Spielers durch Schlüsselwertbeobachtung beibehalten wird. Weitere Informationen finden Sie im AV Foundation Programmierhandbuch):

Verwenden der Complete-Handler-Variante von AVPlayer seekToTime: für sanfteres Scrubbing (Swift).

import AVFoundation 

class MyClass { 

    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() 
      } 
     }) 
    } 

}