2015-02-06 3 views
10

일부 비디오의 경우 requestImageForAsset은 UIImage가 nil 인 경우 완료됩니다. 다른 동영상의 경우 제대로 작동하며 아직 이유를 파악하지 못했습니다.비디오의 썸네일을 만들 때 PHImageManager.requestImageForAsset이 nil을 반환합니다.

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] 
+0

소리가 버그와 비슷합니다. 특히 일부 동영상에만 적용되고 다른 특정 동영상에는 적용되지 않습니다. [당신이 그것을보고 했습니까?] (http://bugreport.apple.com)? – rickster

+0

버그라고 확신하지 못했기 때문에 신고하지 않았습니다. 나는 내가 할 수 있다고 생각하지만 마지막으로 내가보고 한 것은 10 월에 돌아 왔고 나는 아무것도 듣지 못했다. 그들은 버그 리포트에 답장합니까? –

답변

31

저도 같은 문제가 된 오늘. 필요한 경우 이미지를 다운로드 할 수있는 옵션을 추가해야했습니다. 이미지 관리자는 축소판 크기 버전을 사용할 수 있다고 생각하지만 네트워크에서 실제 이미지를 가져올 수 없으므로 두 번째 콜백시 nil을 반환합니다. 나는이 두 번째 콜백 이미지가 전무 아니었다 않았다되면

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

:

var options = PHImageRequestOptions() 
options.networkAccessAllowed = true 

그런 다음 귀하의 요청이있는 PARAM을 만드세요 : 그래서이 문제를 해결하기 위해 나는이 같은 PHImageRequestOptions() 객체를 만들었습니다. 이미지보기를 사용하지 않으려 고하지 않도록 이미지보기의 이미지를 0으로 설정하지 않는 것이 좋습니다. 나는 그 이미지가 항상 거기에 있다고 가정 할 수 있다고 생각하지 않는다. 희망이 도움이!

편집 : 설명하기 만하면됩니다. 각 요청에 대한 제 경우에는 클로저가 두 번 호출됩니다. 처음에는 이미지가 0이 아니고 두 번째로 이미지가 아닙니다. 축소판 크기 버전을 사용할 수 있지만 전체 크기가 아니기 때문에 이것이라고 생각합니다. 전체 크기의 이미지를 가져 오기 위해서는 네트워크 액세스가 필요했습니다.

+0

networkAccessAllowed = true, 제 경우에는 도움이되지 않았습니다. –

+4

docs는'''networkAccessAllowed''의 디폴트 값은 YES이지만, 헤더와 관찰 된 행동은 기본값이 사실 NO임을 나타냅니다. – jamone

+0

나를 위해 일했습니다. 감사. – jonas

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

나는 비슷한 문제를 가지고 있지만, 사진없는 비디오였다. 미디어 유형을 지정하지 않았습니다.

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

위의 회선이 문제를 해결했습니다.

관련 문제