2016-04-07 5 views
0

Mein Ziel ist, dass, wenn Benutzer eine Taste drücken, mehrere Video-Frames werden so schnell wie möglich erfasst und schließlich in Fotoalbum in iPhone gespeichert.Holen Sie sich mehrere Video-Frames so schnell wie möglich mit iPhone Kamera mit swift

Ich bin nicht vertraut mit swift, also verwende ich eine sehr beschissene Implementierung. Ich definiere eine int-Zahl mit 0 und ändere sie zu den Bildnummern, die ich erfassen möchte, wenn der Benutzer die Taste drückt.

var number:Int? = 0 

@IBAction func takeFrames(sender: UIButton) { 
    self.number=5; 
} 

dann in den Delegaten speichere ich diesen Rahmen zum Fotoalbum:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 
    if(number>0) { 
     let rawImage:UIImage = self.imageFromSampleBuffer(sampleBuffer) 
     let img = UIImagePNGRepresentation(rawImage) 
     let pngImg = UIImage.init(data: img!) 
     UIImageWriteToSavedPhotosAlbum(pngImg!, nil, nil, nil) 
     print("PNG frame write to photo album successfully") 
     number = number!-1; 
    } 

} 

Meine Frage ist:

1) Kann ich mehr elegant und sicher Taste verwenden, um Steuer drücken die Bilder erfassen?

2) Momentan speichere ich den Rahmen einzeln, so dass ich nicht das Ziel erreiche, dass Frames so schnell wie möglich aufgenommen werden, kann ich alle Frames, die ich brauche, am Ende in ein Fotoalbum speichern ?

Vielen Dank im Voraus.

Antwort

0

versuchen dies zu tun:

let imageArray: NSMutableArray? 
    for _ in 0 ..< 5 { 
     let rawImage:UIImage = self.imageFromSampleBuffer(sampleBuffer) 
     let img = UIImagePNGRepresentation(rawImage) 
     let pngImg = UIImage.init(data: img!) 
     imageArray?.addObject(pngImg!) 

    } 
    for image in imageArray! { 
     UIImageWriteToSavedPhotosAlbum(image as! UIImage, nil, nil, nil) 
    } 
    print("PNG frame write to photo album successfully") 

Swift manchmal verwirrend in für Aussagen werden kann. Dies wird 5 Bilder aufnehmen.

+0

Danke. Ihrem Vorschlag folgend, benutze ich ein "var imageArray = [CMSampleBuffer?]()", Um alle Frames zu erhalten und schließlich die Transformation durchzuführen und Arbeit zu sparen. Irgendein Vorschlag für meine Frage 1)? –

+0

@JunFang nicht sicher. Sie könnten versuchen, eine Guard-Anweisung oder einen try-Block zu verwenden. Das würde es auf jeden Fall sicher machen. Ich denke, dir geht es gut. –

Verwandte Themen