来自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(虽然只是为了播放来自PHAsset
video)。 在这个答案中分享,可能会帮助别人。
static func playVideo (view:UIViewController, asset:PHAsset)
请检查这个答案
只是想从@jlw的评论中发布隐藏的gem
@ rishu1992对于慢动作video,抓住AVComposition的AVCompositionTrack(mediaType AVMediaTypeVideo),抓住它的第一个段(AVCompositionTrackSegmenttypes),然后访问它的sourceURL属性。 – jlw 15年8月25日在11:52