2016-08-03 10 views
11

AVAssetImageGenerator.generateCGImagesAsynchronouslyForTimes kullanan bir OS X uygulaması üzerinde çalışıyorum ve normal olarak iyi çalışıyor. Ancak, bir süre sonra geri döndüğüm küçük resim sadece ilk birkaç piksel satırını içeriyor ve geri kalanı yeşil, bazen görüntüler yeşilin farklı tonları olacak. İzlenmesi çok zor çünkü tutarlı bir şekilde gerçekleşmiyor, ancak küçük resimlerin yarısı etkilendiğinde.generateCGImagesAsenkronizeForZamanlar bazen küçük resimlerin tamamını oluşturmuyor

enter image description here

Ama çoğu kez bu olur: Burada

enter image description here

Ben küçük resimler oluşturmak için kullanıyorum kodudur:

Bu benim görmeyi beklediğimiz bir resimdir
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) 

Ve bu şekilde küçük resimlerini nasıl alıyorum:

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

Herhangi bir yardım için teşekkür ederiz, teşekkürler!

+1

Merak ettiğim şey AVAsset'in nasıl oluşturulmasını sağlıyorsunuz? Eğer 'NSItemProvider' kullanıyorsanız, bu dosyanın görüntüsü olarak Apple'ın varsayılan küçük resmini veren tamamlayıcı işleyici ile birlikte gelir. – NSGangster

+0

Gerçekten mi? Kulağa hoş geliyor, teşekkürler bunu denemeliyim. Şimdi onları oluşturmak için 'AVURLAsset (URL: url)' kullanıyorum. – Addison

+0

[Link] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSItemProvider_Class/#//apple_ref/occ/instm/NSItemProvider/loadPreviewImageWithOptions:completionHandler]). İşte bu önizleme görüntü işleyicisine bir bağlantı. Ve ben sadece bunu kullanmak istedim 'NSItemProvider' initWithURL' var kontrol ettim. – NSGangster

cevap

5

generateCGImagesAsynchronouslyForTimes Yönteminin yerine, görüntüyü varlıktan almak ve daha önce kaydettiğiniz gibi kaydetmek için copyCGImageAtTime Yöntemini kullanabilirsiniz. İşte kod.

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