generateCGImagesAsynchronouslyForTimes有时不生成整个缩略图

Add*_*son 13 thumbnails avfoundation avassetimagegenerator swift

我正在使用正在使用的OS X应用程序,AVAssetImageGenerator.generateCGImagesAsynchronouslyForTimes它通常可以正常工作.然而,偶尔我回来的缩略图只包含前几行像素,其余的是绿色,有时图像将是不同的绿色阴影.追踪是非常困难的,因为它不会一直发生,但是当它确实有大约一半的缩略图受到影响时.这是我期望看到的图像:

在此输入图像描述

但通常会发生这种情况:

在此输入图像描述

这是我用来生成缩略图的代码:

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)
Run Code Online (Sandbox Code Playgroud)

这就是我正在检索缩略图的方式:

dispatch_group_wait(file.waitForThumbnail!, DISPATCH_TIME_FOREVER)
dispatch_async(dispatch_get_main_queue()) {
    self.imageView.image = file.thumbnail
}
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助,谢谢!

Bha*_*iya 6

generateCGImagesAsynchronouslyForTimes您可以使用copyCGImageAtTimeMethod从资产中获取图像,并保存之前保存的图像,而不是使用Method .这是代码.

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)
}
Run Code Online (Sandbox Code Playgroud)