来自PHAsset的NSURL

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属性.

我不确定你是否可以创建一个新资产,但它确实为你提供了位置.

  • @ rishu1992对于慢动作视频,抓取AVComposition的AVCompositionTrack(mediaType AVMediaTypeVideo),抓取其第一段(AVCompositionTrackSegment类型),然后访问其sourceURL属性. (9认同)
  • 也许是一个愚蠢的问题,但这对图像和视频有用吗? (4认同)

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)

  • 好像我没有访问权限(获得照片库的访问权限).当我尝试NSFileManager.defaultManager().fileExistsAtPath()时,它返回false,所以我也无法获取文件的内容.但该文件肯定存在. (7认同)
  • 这还没有解决,这很疯狂.我需要一个具有永久读取权限的可靠URL,以用于"NSURLSessionUploadTask"工作.由于iPhone的存储空间有限,我无法将所有资产复制到临时位置,只是为了上传.用户的错误消息是什么样的:"我们很抱歉您无法将文件上传到我们的服务器,因为您设备上的存储空间太小了???" 没有人会理解这一点 (2认同)

Sah*_*hil 9

如果您有PHAsset,您可以获取所述资产的网址,如下所示:

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


bca*_*tle 9

使用localIdentifierPHObject 的新属性.(PHAsset继承自此).

它提供与ALAsset URL类似的功能,即您可以通过调用方法来加载资源

+[PHAsset fetchAssetsWithLocalIdentifiers:identifiers options:options]
Run Code Online (Sandbox Code Playgroud)


des*_*ond 5

以上所有解决方案都不适用于慢动作视频.我找到的解决方案处理所有视频资产类型是这样的:

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)