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

Ios 尝试从PHAsset获取AVAssetExportSession的输出时获取空结果,ios,swift,swift3,avfoundation,phasset,Ios,Swift,Swift3,Avfoundation,Phasset,我正在尝试构建一个小型玩具iOS应用程序,它合并了用户照片库中的两个视频资源。我已经到了使用AVMutableComposition实例合并视频的地步,现在我需要导出合成。我使用以下代码执行此操作: func saveEditedComposition(_ composition: AVMutableComposition) { let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory,

我正在尝试构建一个小型玩具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.
            }
        }
    })
}

问题是,当completionHandler运行时,我可以看到我的导出器已完成,没有错误(
如果exporter.status==.completed{
),但当我尝试访问exporter.outputURL上的资源时,它返回一个空的
PHFetchResult
。有人能看到我在这里做错了什么吗?

您正在将视频导出到文件系统(文档目录),但仍然从相机卷/
中获取视频

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

ALAssetsLibrary().writeVideoAtPath(toSavedPhotosAlbum: exporter.outputURL!) { alAssetURL, error in      
}
但是,
AlassetLibrary
现在已被弃用,您应该使用
PHPhotoLibrary
。我不知道照片框架,但我认为它是这样工作的:

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!
中的文件