2017-05-10 9 views
2

Ich möchte 3 Sekunden lang 20 Screenshots pro Sekunde machen, all diese werden zu einem UIImage Array hinzugefügt, das in ein Video umgewandelt wird.Nehmen Sie 20 Screenshots pro Sekunde Swift?

Hier ist der Code im mit einem Screenshot nehmen:

func screenshot() { 
     var imageSize = CGSize.zero 

     let orientation = UIApplication.shared.statusBarOrientation 
     if UIInterfaceOrientationIsPortrait(orientation) { 
      imageSize = UIScreen.main.nativeBounds.size 
     } else { 
      imageSize = CGSize(width: UIScreen.main.nativeBounds.size.height, height: UIScreen.main.nativeBounds.size.width) 
     } 

     UIGraphicsBeginImageContextWithOptions(imageSize, false, 0) 
     for window in UIApplication.shared.windows { 
      window.drawHierarchy(in: window.bounds, afterScreenUpdates: true) 
     } 

     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     images.append(image!) 

    } 

ich folgenden question gelesen habe, obwohl es ruhig alt ist, und ich bin sicher, dass für 3 Sekunden bei 20FPS es getan werden kann , aber ich bin mir nicht sicher, welcher wäre der beste Weg, um es zu erreichen.

Edit:Verwenden UIScreen.main.nativeBounds.size statt UIScreen.main.bounds.size oder Sie werden die ‚falsche‘ Bildgröße erhalten, und es kann ein Schmerz ruhig sein. Dies gilt, wenn Anzeige Zoom auf Gezoomte gesetzt anstatt Standard-Kredit: @ Christopher Pickslay

+0

Warum nehmen Sie nicht nur ein Video von der Bildschirm? Oder benutze eine Bibliothek, die das für dich tut: https://github.com/alskipp/ASScreenRecorder – JAL

+0

Ich bin mir nicht sicher, warum ich das vernachlässigt habe, da ich ein bisschen Forschung über existierende Bibliotheken gemacht habe, die dir erlauben, den Bildschirm aufzuzeichnen , und stieß auf ASScreenRecorder, obwohl er folgendes ausprobieren wollte. –

Antwort

1

Das funktionierte:

var limit = 80 

func capture() { 

    if limit > 0 { 

    delay(0.03) { 

    self.screenshot() 

    self.capture() 

    } else { 

convertToVideo() 

} 

func screenshot() { 

     var imageSize = CGSize.zero 

     let orientation = UIApplication.shared.statusBarOrientation 
     if UIInterfaceOrientationIsPortrait(orientation) { 
      imageSize = UIScreen.main.nativeBounds.size 
     } else { 
      imageSize = CGSize(width: UIScreen.main.nativeBounds.size.height, height: UIScreen.main.nativeBounds.size.width) 
     } 

     UIGraphicsBeginImageContextWithOptions(imageSize, false, 0) 
     for window in UIApplication.shared.windows { 
      window.drawHierarchy(in: window.bounds, afterScreenUpdates: true) 
     } 

     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     images.append(image!) 

     limit = limit - 1 

    } 

Delay ist:

func delay(_ delay:Double, closure:@escaping()->()) { 
    DispatchQueue.main.asyncAfter(
     deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC)))/Double(NSEC_PER_SEC), execute: closure) 
} 
Verwandte Themen