Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVAssetExportSession无法导出从iCloud下载的视频_Ios_Swift_Avfoundation_Photosframework - Fatal编程技术网

Ios AVAssetExportSession无法导出从iCloud下载的视频

Ios AVAssetExportSession无法导出从iCloud下载的视频,ios,swift,avfoundation,photosframework,Ios,Swift,Avfoundation,Photosframework,我正在尝试创建从用户相册中选择的视频的缩小版本。输出的最大尺寸为720p。因此,在检索视频时,我使用.mediumQualityFormat作为deliveryMode。如果用户设备中不存在原始视频或其中等质量版本,这会导致iOS从iCloud检索720p视频 let videoRequestOptions = PHVideoRequestOptions() videoRequestOptions.deliveryMode = .mediumQualityFormat videoRequestO

我正在尝试创建从用户相册中选择的视频的缩小版本。输出的最大尺寸为720p。因此,在检索视频时,我使用
.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"
    }
})