2016-08-03 31 views
11

Ich arbeite an einer OS X App, die AVAssetImageGenerator.generateCGImagesAsynchronouslyForTimes verwendet, und es funktioniert normalerweise gut. Hin und wieder enthält das Miniaturbild, das ich zurückbekomme, nur die ersten paar Pixelreihen, und der Rest ist grün, manchmal haben die Bilder unterschiedliche Grüntöne. Es ist sehr schwer aufzuspüren, weil es nicht konsistent passiert, aber wenn es etwa die Hälfte der Thumbnails betrifft, sind sie betroffen. Dies ist ein Bild von dem, was ich erwarte, um zu sehen:generateCGImagesAsynchronConnorousForTimes generieren manchmal ganze Thumbnails nicht

enter image description here

Aber oft dies geschieht:

enter image description here

Hier ist der Code, den ich die Thumbnails erzeugen bin mit:

let assetGenerator = AVAssetImageGenerator(asset: AVURLAsset(URL: url)) 
assetGenerator.appliesPreferredTrackTransform = true 
let time = CMTime(seconds: 0, preferredTimescale: 30) 

let handler: AVAssetImageGeneratorCompletionHandler = { _, image, _, res, error in 
    defer { dispatch_group_leave(self.waitForThumbnail!) } 

    guard let image = image where res == .Succeeded else { 
     if let error = error { print(error) } 
     return 
    } 

    let s = CGSize(width: CGImageGetWidth(image), height: CGImageGetHeight(image)) 
    self.thumbnail = NSImage(CGImage: image, size: s) 

} 

waitForThumbnail = dispatch_group_create() 
dispatch_group_enter(waitForThumbnail!) 

assetGenerator.maximumSize = maxThumbnailSize 
assetGenerator.generateCGImagesAsynchronouslyForTimes([NSValue(CMTime: time)], completionHandler: handler) 

Und das ist, wie ich die Thumbnails abrufen:

dispatch_group_wait(file.waitForThumbnail!, DISPATCH_TIME_FOREVER) 
dispatch_async(dispatch_get_main_queue()) { 
    self.imageView.image = file.thumbnail 
} 

Jede Hilfe wird sehr geschätzt, danke!

+1

Aus Neugier, wie erstellen Sie die 'AVAsset's? Wenn Sie 'NSItemProvider' verwenden, wird ein vollständiger Handler verwendet, der die Standardminiatur des Applets als Bild für diese Datei angibt. – NSGangster

+0

Oh wirklich? Das klingt nett, danke, dass ich das versuchen muss. Ich benutze 'AVURLAsset (URL: url)', um sie jetzt zu erstellen. – Addison

+0

[Link] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSItemProvider_Class/#//apple_ref/occ/instm/NSItemProvider/loadPreviewImageWithOptions:completionHandler]). Hier ist ein Link zu diesem Vorschaubild-Handler. Und ich habe gerade überprüft 'NSItemProvider' hat' initWithURL', wenn Sie nur das verwenden wollten. – NSGangster

Antwort

5

Anstatt generateCGImagesAsynchronouslyForTimes Methode zu verwenden, können Sie copyCGImageAtTime Methode verwenden, um das Bild vom Asset zu erhalten und das Bild so zu speichern, wie Sie zuvor gespeichert haben. Hier ist der Code.

let assetGenerator = AVAssetImageGenerator(asset: AVURLAsset(URL: url)) 
assetGenerator.appliesPreferredTrackTransform = true 
assetGenerator.maximumSize = maxThumbnailSize 
let time = CMTime(seconds: 0, preferredTimescale: 30) 
do { 
    let cgImage = try assetGenerator.copyCGImageAtTime(time, actualTime: nil) 
    let s = CGSize(width: CGImageGetWidth(cgImage), height: CGImageGetHeight(cgImage)) 
    self.thumbnail = NSImage(CGImage: cgImage, size: s)  
} catch let error { 
    print(error) 
}