创buildvideo缩略图时,PHImageManager.requestImageForAsset返回nil

对于一些video,requestImageForAsset完成与UIImage是零。 对于其他video,它工作正常,我还没有弄清楚为什么呢。

func createThumbnailForVideo(video: PHAsset) -> Future<NSURL> { let promise = Promise<NSURL>() let options = PHImageRequestOptions() options.synchronous = true imageManager.requestImageForAsset(video, targetSize: CGSizeMake(640, 640), contentMode: .AspectFill, options: options) { (image:UIImage!, info) -> Void in if image == nil { println("Error: Couldn't create thumbnail for video") promise.error(MyErrors.videoThumb()) } else { if let thumbURL = self.savePhotoAsTemporaryFile(image) { promise.success(thumbURL) } else { promise.error(MyErrors.videoThumb()) } } } return promise.future } 

我也回来请求的信息,但我不知道如何解释信息:

 [PHImageResultIsDegradedKey: 0, PHImageResultWantedImageFormatKey: 4037, PHImageResultIsPlaceholderKey: 0, PHImageResultIsInCloudKey: 0, PHImageResultDeliveredImageFormatKey: 9999] 

我今天遇到了同样的问题。 对我来说,我必须添加选项来下载图像。 我认为图像pipe理器有一个可用的缩略图版本,但是由于我没有允许它从networking中获取实际的图像,所以在第二次callback时将返回零。 所以要解决这个问题,我创build了一个像这样的PHImageRequestOptions()对象:

 var options = PHImageRequestOptions() options.networkAccessAllowed = true 

然后把这个作为一个参数发送给你的请求:

 PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: PHImageContentMode.AspectFill, options: options) { (image, info) -> Void in if (image != nil) { cell.imageView.image = image } } 

一旦我做到这一点,第二个callback图像不是零。 我认为防止有一个零图像,所以你不把图像视图的图像设置为零是一个好主意。 我不认为你可以认为,图像将永远在那里。 希望这可以帮助!

编辑:只是为了澄清。 在我的情况下,每个请求,closures将被调用两次。 第一次的形象不是零,第二次是。 我认为这是因为缩略图大小的版本可用,但全尺寸没有。 它需要networking访问来获取全尺寸的图像。

我终于find了问题。 contentMode是.AspectFill,但应该是.AspectFit。 我想我可以通过调整PHImageRequestOptionsDeliveryMode和PHImageRequestOptionsResizeMode工作,如果我读了评论。 不过.AspectFit是我正在寻找的。

 enum PHImageContentMode : Int { // Fit the asked size by maintaining the aspect ratio, the delivered image may not necessarily be the asked targetSize (see PHImageRequestOptionsDeliveryMode and PHImageRequestOptionsResizeMode) case AspectFit // Fill the asked size, some portion of the content may be clipped, the delivered image may not necessarily be the asked targetSize (see PHImageRequestOptionsDeliveryMode && PHImageRequestOptionsResizeMode) case AspectFill 

}

我有类似的问题,但它是照片不是video。 我错过了指定媒体types。

 self.assetsFetchResults = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 

上面的线路解决了我的问题。