ios - 使用 PHImageManager 导出视频文件失败:AVFoundationErrorDomain Code=-11800 "The operation could not be completed" Code=-12212
问题描述
我正在尝试使用 Photos iOS SDK 中的 PHImageManager 从模拟器上的相机胶卷中导出视频资产。执行导出完成块时,会导致以下错误:
Error Domain=AVFoundationErrorDomain Code=-11800 "操作无法完成" UserInfo={NSLocalizedFailureReason=发生未知错误 (-12212),NSLocalizedDescription=操作无法完成,NSUnderlyingError=0x600001baa4c0 {Error Domain=NSOSStatusErrorDomain Code=- 12212 “(空)”}}
每次使用模拟器的相机胶卷上的指定视频时都会发生这种情况。但是,这在真实设备上不一致地发生;有些视频导出正常,有些则不行。
为什么会发生这种情况,如何解决,在哪里可以找到错误代码文档?
这是它发生的功能:
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)")
}
}
}
}
解决方案
解决方案:
我发现错误代码“-12212”指的是 kVTColorCorrectionPixelTransferFailedErr。
所以我认为这一定是一个预设或质量设置问题......
我之前尝试过设置requestOptions.deliveryMode = .highQualityFormat
,但没有奏效。但是,我注意到以下调用具有质量预设:
PHImageManager.default().requestExportSession(
forVideo: phAsset, options: requestOptions,
exportPreset: AVAssetExportPreset1280x720
)
当我将其更改为:
PHImageManager.default().requestExportSession(
forVideo: phAsset, options: requestOptions,
exportPreset: AVAssetExportPresetHighestQuality
)
有效!
推荐阅读
- ruby - 这些对象有何不同?
- reactjs - 元素类型无效 - 导出默认值和默认导入
- sql - 如何使用 SQL 选择查询按月计算印度财政年度?
- python-3.x - 列表到字典
- python - 使用 Python 在 Alexa 技能中的两个意图之间的交互
- wordpress - 在 Wordpress 自定义帖子类型循环中使用 ACF 分类字段作为变量
- android - 根据子值对firebase数据库进行排序
- javascript - IIFE 和常规函数的区别(示例)
- python - 为什么 0.0 == False 在 Python 中返回 True?
- heroku - 使用什么服务来部署我的烧瓶 + dash 应用程序