Ios AVAssetExportSession无法导出从iCloud下载的视频
我正在尝试创建从用户相册中选择的视频的缩小版本。输出的最大尺寸为720p。因此,在检索视频时,我使用Ios AVAssetExportSession无法导出从iCloud下载的视频,ios,swift,avfoundation,photosframework,Ios,Swift,Avfoundation,Photosframework,我正在尝试创建从用户相册中选择的视频的缩小版本。输出的最大尺寸为720p。因此,在检索视频时,我使用.mediumQualityFormat作为deliveryMode。如果用户设备中不存在原始视频或其中等质量版本,这会导致iOS从iCloud检索720p视频 let videoRequestOptions = PHVideoRequestOptions() videoRequestOptions.deliveryMode = .mediumQualityFormat videoRequestO
.mediumQualityFormat
作为deliveryMode
。如果用户设备中不存在原始视频或其中等质量版本,这会导致iOS从iCloud检索720p视频
let videoRequestOptions = PHVideoRequestOptions()
videoRequestOptions.deliveryMode = .mediumQualityFormat
videoRequestOptions.isNetworkAccessAllowed = true
PHImageManager.default().requestAVAsset(forVideo: asset, options: videoRequestOptions) { (asset, audioMix, info) in
// Proceess the asset
}
问题是,当我使用AVAssetExportSession
创建资产的缩小版本时,如果资产是中等变体而不是原始版本,则导出过程会立即失败,并出现以下错误:
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (-17507), NSLocalizedDescription=İşlem tamamlanamadı, NSUnderlyingError=0x283bbcf60 {Error Domain=NSOSStatusErrorDomain Code=-17507 "(null)"}}
我在任何地方都找不到这个错误的含义
当我将deliveryMode
属性设置为.auto
或.highQualityFormat
时,一切都正常工作
当我检查资产url时,我注意到当从iCloud检索视频时,其文件名有一个“.medium”后缀,如本例所示:
file:///var/mobile/Media/PhotoData/Metadata/PhotoData/CPLAssets/group338/191B2348-5E19-4A8E-B15C-A843F9F7B5A3.medium.MP4
奇怪的是,如果我使用FileManager
将此url中的视频复制到另一个目录,从该文件创建一个新的AVAsset
,并在创建AVExportSession
实例时使用该资源,问题就会消失
如果有人能提供一些关于问题所在的见解,我将不胜感激
这就是我如何使用AVAssetExportSession创建原始视频的缩小版本
let originalVideoURL = // The url of the asset retrieved from requestAVAsset
let outputVideoPath = NSTemporaryDirectory() + "encodedVideo.mp4"
let outputVideoURL = URL(fileURLWithPath: outputVideoPath)
guard
let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality),
let videoTrack = asset.tracks(withMediaType: .video).first else {
// Error handling
return
}
let videoComposition = AVMutableVideoComposition()
videoComposition.renderSize = scaledSize // How this is calculated is irrelevant
videoComposition.frameDuration = CMTimeMake(value: 1, timescale: 30)
let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
let transform = videoTrack.preferredTransform
layerInstruction.setTransform(transform, at: .zero)
let instruction = AVMutableVideoCompositionInstruction()
instruction.timeRange = CMTimeRangeMake(start: .zero, duration: asset.duration)
instruction.layerInstructions = [layerInstruction]
videoComposition.instructions = [instruction]
exportSession.videoComposition = videoComposition
exportSession.outputURL = outputVideoURL
exportSession.outputFileType = .mp4
exportSession.shouldOptimizeForNetworkUse = true
exportSession.exportAsynchronously(completionHandler: {[weak self] in
guard let self = self else { return }
if let url = exportSession.outputURL, exportSession.status == .completed {
// Works for local videos
} else {
// Fails with error code 17507 when loading videos with delivery size "Medium"
}
})