2016-09-16 17 views
1

Ich versuche, Miniaturbilder aus einem Video mit dem folgenden Code zu generieren. Es erzeugt UIImagages, aber die Bilder sind alle zu verschiedenen Zeiten gleich. Für ein Video, das 3 Sekunden dauert, werden beispielsweise 6 Bilder erzeugt, aber alle Bilder haben das gleiche Bild für den Anfang des Videos. Irgendwelche Ideen, was ich falsch gemacht habe?Generiere Bilder von AVAssetImageGenerator

let asset = AVAsset(url: videoURL) 
       let imageGenerator = AVAssetImageGenerator(asset: asset) 

       let scale = 2 
       let step = 1 
       let duration = Int(CMTimeGetSeconds(asset.duration) * Double(scale)) 
       var epoches = [NSValue]() 
       for i in stride(from: 1, to: duration, by: step) { 
        //let time = CMTimeMake(Int64(i), Int32(scale)) 
        let time = CMTimeMakeWithSeconds(Double(i)/Double(scale), Int32(scale)) 
        let cgImage = try! imageGenerator.copyCGImage(at: time, actualTime: nil) 
        let uiImage = UIImage(cgImage: cgImage) 
        self?.imagePool.append(uiImage) 
        epoches.append(NSValue(time: time)) 
       } 

Antwort

3

standardmäßig AVAssetImageGenerator gibt sich sehr großzügig Toleranzen, wenn Rahmen für eine bestimmte Zeit abgerufen werden. Wenn Sie copyCGImage 's actualTime verwenden, werden Sie in der Praxis sehen, dass es ungefähr ein oder zwei Sekunden ist, obwohl es technisch kCMTimeFlags_PositiveInfinity ist, also in Ihrem kurzen Video wird die Hälfte Ihrer Bilder Duplikate sein.

also die Toleranzen etwas kleiner zu sehen einzigartigen Rahmen gesetzt:

imageGenerator.requestedTimeToleranceBefore = CMTimeMake(1, 15) 
imageGenerator.requestedTimeToleranceAfter = CMTimeMake(1, 15) 
+0

wirkt wie ein Zauber! Danke Mann –

+0

Für mich war es nutzlos, Nenner zu ändern, aber das Einstellen kleinerer Zähler wie CMTimeMake (0,01, 1) hat den Trick gemacht. – Varrry

+0

Seltsam! Was Sie getan haben _sollte_ äquivalent zu 'CMTimeMake (1, 100)' sein! –