创建视频缩略图时,PHImageManager.requestImageForAsset返回nil

时间:2015-02-06 15:42:31

标签: ios swift

对于某些视频,requestImageForAsset以UIImage为零完成。对于其他视频,它工作正常,我还没弄清楚为什么。

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]

3 个答案:

答案 0 :(得分:38)

我今天遇到了同样的问题。对我来说,如有必要,我必须添加下载图像的选项。我认为图像管理器有一个缩略图版本可用,但由于我不允许它从网络中获取实际图像,它将在第二次回调时返回nil。所以为了解决这个问题,我创建了一个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
    }
}

一旦我这样做,第二个回调图像不是零。我认为防止拥有零图像仍然是一个好主意,因此您不要将图像视图的图像设置为零。我不认为你可以认为图像永远存在。希望这有帮助!

编辑:只是为了澄清。在我的情况下,每个请求,闭包将被调用两次。第一次图像不是零,第二次是零。我认为这是因为缩略图版本可用,但完整尺寸不是。它需要网络访问才能获取完整大小的图像。

答案 1 :(得分:0)

我终于找到了问题。 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

}

答案 2 :(得分:-2)

我有类似的问题,但是照片不是视频。我错过了指定媒体类型。

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

以上为我解决了这个问题。