来自PHAsset的NSURL

我正在转换我们的应用程序使用iOS8的照片框架,ALAsset框架显然是iOS8下的二等公民。

我遇到的一个问题是,我们的架构确实需要一个代表“磁盘”上媒体位置的NSURL。 我们用这个上传媒体到我们的服务器进行进一步处理。

ALAsset很简单:

ALAssetRepresentation *rep = [asset defaultRepresentation]; self.originalVideo = rep.url; 

但是我只是在PHAsset中看不到这个能力。 我想我可以打电话给:

  imageManager.requestImageDataForAsset 

然后把它写到文件系统中的一个临时位置,但是这看起来非常重量和浪费,更不用说可能很慢了。

有没有办法得到这个,或者我会重构更多的我的应用程序只使用iOS7的NSURLs和一些其他方法的iOS8?

如果您使用[ imageManager requestAVAssetForVideo …],它将返回一个AVAsset 。 AVAsset实际上是一个AVURLAsset ,所以如果你投它,你可以访问它的url属性。

我不确定你是否可以创build一个新的资产,但它确实给你的位置。

SWIFT 2.0版本该函数从PHAsset(图像和video)返回NSURL,

 func getAssetUrl(mPhasset : PHAsset, completionHandler : ((responseURL : NSURL?) -> Void)){ if mPhasset.mediaType == .Image { let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions() options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in return true } mPhasset.requestContentEditingInputWithOptions(options, completionHandler: {(contentEditingInput: PHContentEditingInput?, info: [NSObject : AnyObject]) -> Void in completionHandler(responseURL : contentEditingInput!.fullSizeImageURL) }) } else if mPhasset.mediaType == .Video { let options: PHVideoRequestOptions = PHVideoRequestOptions() options.version = .Original PHImageManager.defaultManager().requestAVAssetForVideo(mPhasset, options: options, resultHandler: {(asset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) -> Void in if let urlAsset = asset as? AVURLAsset { let localVideoUrl : NSURL = urlAsset.URL completionHandler(responseURL : localVideoUrl) } else { completionHandler(responseURL : nil) } }) } } 

如果你有一个PHAsset,你可以得到像这样的资产的URL:

 [asset requestContentEditingInputWithOptions:editOptions completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { NSURL *imageURL = contentEditingInput.fullSizeImageURL; }]; 

使用localIdentifier的新的localIdentifier属性。 (PHAsset从此inheritance)。

它提供了与ALAsset URL相似的function,即可以通过调用方法来加载资源

 +[PHAsset fetchAssetsWithLocalIdentifiers:identifiers options:options] 

以上所有解决scheme都不适用于慢动作video。 我find的解决scheme处理所有video资产types是这样的:

 func createFileURLFromVideoPHAsset(asset: PHAsset, destinationURL: NSURL) { PHCachingImageManager().requestAVAssetForVideo(self, options: nil) { avAsset, _, _ in let exportSession = AVAssetExportSession(asset: avAsset!, presetName: AVAssetExportPresetHighestQuality)! exportSession.outputFileType = AVFileTypeMPEG4 exportSession.outputURL = destinationURL exportSession.exportAsynchronouslyWithCompletionHandler { guard exportSession.error == nil else { log.error("Error exporting video asset: \(exportSession.error)") return } // It worked! You can find your file at: destinationURL } } } 

在这里看到这个答案。

这一个在这里 。

根据我的经验,您需要首先将资产导出到磁盘以获得完全可访问的/可靠的URL。

与上面相关的答案描述了如何做到这一点。

我有类似的video文件的问题,为我工作是:

 NSString* assetID = [asset.localIdentifier substringToIndex:(asset.localIdentifier.length - 7)]; NSURL* videoURL = [NSURL URLWithString:[NSString stringWithFormat:@"assets-library://asset/asset.mov?id=%@&ext=mov", assetID]]; 

资产是PHAsset。

在PHAsset的url中,我曾经在Swift 2上编写过一个util func(虽然只是为了播放来自PHAssetvideo)。 在这个答案中分享,可能会帮助别人。

 static func playVideo (view:UIViewController, asset:PHAsset) 

请检查这个答案

只是想从@jlw的评论中发布隐藏的gem

@ rishu1992对于慢动作video,抓住AVComposition的AVCompositionTrack(mediaType AVMediaTypeVideo),抓住它的第一个段(AVCompositionTrackSegmenttypes),然后访问它的sourceURL属性。 – jlw 15年8月25日在11:52