Подтвердить что ты не робот

GenerateCGImagesAsynchronouslyForTimes иногда не генерируют целые эскизы

Я работаю над 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)

И вот как я извлекаю миниатюры:

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

Любая помощь очень ценится, спасибо!

4b9b3361

Ответ 1

Вместо использования метода generateCGImagesAsynchronouslyForTimes вы можете использовать метод copyCGImageAtTime, чтобы получить изображение из актива и сохранить это изображение по мере сохранения ранее. Вот код.

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