Pau*_*nne 39 alassetslibrary ios8 photosframework phasset
我正在将我们的应用程序转换为使用iOS8的Photos Framework,ALAsset框架显然是iOS8下的二等公民.
我遇到的一个问题是我们的架构真的需要一个代表媒体在"磁盘"上的位置的NSURL.我们使用它将媒体上传到我们的服务器以进行进一步处理.
使用ALAsset很容易:
ALAssetRepresentation *rep = [asset defaultRepresentation];
self.originalVideo = rep.url;
Run Code Online (Sandbox Code Playgroud)
但我只是没有在PHAsset中看到这种能力.我猜我可以打电话:
imageManager.requestImageDataForAsset
Run Code Online (Sandbox Code Playgroud)
然后把它写到文件系统中的临时点,但这看起来非常重量级和浪费,更不用说潜在的慢.
有没有办法得到这个,或者我将重构更多的我的应用程序只使用NSURLs的iOS7和其他一些方法的iOS8?
jlw*_*jlw 24
如果您使用[ imageManager
requestAVAssetForVideo
...],它将返回AVAsset
.AVAsset实际上是一个AVURLAsset
,所以如果你投射它,你可以访问它的 - url
属性.
我不确定你是否可以创建一个新资产,但它确实为你提供了位置.
Ada*_*nic 17
SWIFT 2.0版本 此函数从PHAsset(图像和视频)返回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)
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有PHAsset,您可以获取所述资产的网址,如下所示:
[asset requestContentEditingInputWithOptions:editOptions
completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
NSURL *imageURL = contentEditingInput.fullSizeImageURL;
}];
Run Code Online (Sandbox Code Playgroud)
使用localIdentifier
PHObject 的新属性.(PHAsset继承自此).
它提供与ALAsset URL类似的功能,即您可以通过调用方法来加载资源
+[PHAsset fetchAssetsWithLocalIdentifiers:identifiers options:options]
Run Code Online (Sandbox Code Playgroud)
以上所有解决方案都不适用于慢动作视频.我找到的解决方案处理所有视频资产类型是这样的:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26616 次 |
最近记录: |