使用 PHImageManager 导出视频文件失败:AVFoundationErrorDomain Code=-11800 "The operation could not be comp

Posted

技术标签:

【中文标题】使用 PHImageManager 导出视频文件失败:AVFoundationErrorDomain Code=-11800 "The operation could not be completed" Code=-12212【英文标题】:Export of Video file using PHImageManager fails:AVFoundationErrorDomain Code=-11800 "The operation could not be completed" Code=-12212 【发布时间】:2021-10-09 21:24:24 【问题描述】:

我正在尝试使用 Photos ios SDK 中的 PHImageManager 从模拟器上的相机胶卷中导出视频资产。当导出完成块执行时,会导致这个错误:

错误域=AVFoundationErrorDomain 代码=-11800 "操作无法完成" UserInfo=NSLocalizedFailureReason=发生未知错误 (-12212),NSLocalizedDescription=操作无法完成,NSUnderlyingError=0x600001baa4c0 错误域=NSOSStatusErrorDomain代码=-12212 "(null)"

每次在模拟器的相机胶卷上指定视频时都会发生这种情况。但是,这在真实设备上不一致地发生;有些视频可以正常导出,有些则不行。

为什么会发生这种情况,如何解决,在哪里可以找到错误代码文档?

这是它发生的函数:

public func exportVideoFile(
        options: PHVideoRequestOptions? = nil,
        outputURL: URL? = nil,
        outputFileType: AVFileType = .mov,
        progressBlock: ((Double) -> Void)? = nil,
        completionBlock: @escaping ((URL, String) -> Void)
    ) 
        guard
            let phAsset = self.phAsset,
            phAsset.mediaType == .video,
            let writeURL = videoFilename(phAsset: phAsset),
            let mimetype = MIMEType(writeURL)
        else  return 

        var requestOptions = PHVideoRequestOptions()
        if let options = options 
            requestOptions = options
         else 
            requestOptions.isNetworkAccessAllowed = true
            requestOptions.deliveryMode = .fastFormat
        
        requestOptions.progressHandler =  progress, _, _, _ in
            DispatchQueue.main.async 
                debugPrint("progress", progress)
                progressBlock?(progress)
            
        

        PHImageManager.default().requestExportSession(
            forVideo: phAsset, options: requestOptions,
            exportPreset: AVAssetExportPreset1280x720
        )  session, _ in
            guard let session = session else  return 

            session.outputURL = writeURL
            session.outputFileType = outputFileType
            session.shouldOptimizeForNetworkUse = true

            session.exportAsynchronously 
                completionBlock(writeURL, mimetype)
                
                if let err = session.error  // Error happens here
                    debugPrint("Video Export Session Error: \(err.localizedDescription)")
                 else 
                    debugPrint("Video Export Session Status: \(session.status)")
                
            
        
    

【问题讨论】:

"Code=-12212" 指的是以下错误:kVTColorCorrectionPixelTransferFailedErr 【参考方案1】:

解决方案:

我发现错误代码“-12212”指的是kVTColorCorrectionPixelTransferFailedErr。

所以我认为这一定是预设或质量设置问题...

我之前尝试过设置requestOptions.deliveryMode = .highQualityFormat,但没有成功。但是,我注意到以下调用具有质量预设:

PHImageManager.default().requestExportSession(
            forVideo: phAsset, options: requestOptions,
            exportPreset: AVAssetExportPreset1280x720
        )

当我把它改成这样时:

PHImageManager.default().requestExportSession(
            forVideo: phAsset, options: requestOptions,
            exportPreset: AVAssetExportPresetHighestQuality
        ) 

成功了!

【讨论】:

我从这个网站找到了代码:osstatus.com 对于某些视频,我只在 iOS 14.5 上遇到了同样的问题,而保留 AVAssetExportPresetHighestQuality 也无济于事。 @SunilChauhan 您可以尝试将 var requestOptions = PHVideoRequestOptions() 设置为 requestOptions.deliveryMode = .automatic.highQualityFormat .automatic 是默认值,因此可能是其他选项之一

以上是关于使用 PHImageManager 导出视频文件失败:AVFoundationErrorDomain Code=-11800 "The operation could not be comp的主要内容,如果未能解决你的问题,请参考以下文章

从标准输入复制 CSV 文件会引发“列缺失数据”

ios13使用PHImageManager获取原始图像

我无法将视频上传到服务器

使用 PHImageManager 时,PHAsset 返回 UIImage 的 nil 值

Wireshark Legacy将RTP包导出为视频文件

PHImageManager 在许多图像请求后崩溃