尝试从 PHAsset 获取 AVAssetExportSession 的输出时得到空结果

Posted

技术标签:

【中文标题】尝试从 PHAsset 获取 AVAssetExportSession 的输出时得到空结果【英文标题】:Getting empty result when trying to fetch the output of AVAssetExportSession from PHAsset 【发布时间】:2016-11-11 14:44:18 【问题描述】:

我正在尝试构建一个小型玩具 ios 应用程序,用于合并用户照片库中的两个视频资源。我已经到了使用AVMutableComposition 实例合并视频的地步,现在我需要导出合成。我正在使用以下代码:

func saveEditedComposition(_ composition: AVMutableComposition) 
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let savePath = (documentDirectory as NSString).strings(byAppendingPaths: ["mergeVideo.mov"])[0]
    let url = NSURL(fileURLWithPath: savePath)

    // Set up exporter
    guard let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) else  return 
    exporter.outputURL = url as URL
    exporter.outputFileType = AVFileTypeQuickTimeMovie
    exporter.shouldOptimizeForNetworkUse = true

    // Perform the export
    exporter.exportAsynchronously(completionHandler:  () -> Void in
        // Upon completion of the export, 
        DispatchQueue.global().async 
            if exporter.status == .completed 
                let fetchResult = PHAsset.fetchAssets(withALAssetURLs: [exporter.outputURL!], options: nil))
                let phAsset = fetchResult.firstObject! // Crashes here, returning nil.
            
        
    )

问题是,当完成处理程序运行时,我可以看到我的导出器已经完成且没有错误(if exporter.status == .completed ),但是当我尝试访问exporter.outputURL 的资产时,它返回一个空的@987654325 @。谁能看到我在这里做错了什么?

【问题讨论】:

【参考方案1】:

您正在将视频导出到文件系统(Documents 目录),但正在从相机胶卷/ALAssetsLibrary 中获取。

这取决于您需要对导出的文件执行什么操作。如果需要在ALAssetsLibrary,可以使用

ALAssetsLibrary().writeVideoAtPath(toSavedPhotosAlbum: exporter.outputURL!)  alAssetURL, error in      

但是ALAssetsLibrary 现在已弃用,您应该使用phphotoLibrary。我不知道 Photos 框架,但我认为它是这样工作的:

var placeHolder: PHObjectPlaceholder?

PHPhotoLibrary.shared().performChanges(
    let changeRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: exporter.outputURL!)
    if let changeRequest = changeRequest 
        // maybe set date, location & favouriteness here?
        placeHolder = changeRequest.placeholderForCreatedAsset
    
)  success, error in
    placeHolder?.localIdentifier    // should identify asset from now on?

如果您不需要视频保存在相机胶卷中,那么您可以直接使用exporter.outputURL! 中的文件。

【讨论】:

以上是关于尝试从 PHAsset 获取 AVAssetExportSession 的输出时得到空结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHAsset 获取视频的缩略图?

PHAsset 无法获取

从 PHAsset 获取已编辑照片的 URL

照片框架 - 如何从 PHAsset 获取图像的 CLLocation?

如何为从照片框架获取的 PHAsset 添加分页?

按顺序获取 PHAsset