Я пытаюсь уменьшить размер видео, используя следующий метод:
func reduceVideoSize(_ originalVideoURL : String, completion: @escaping (_ data: Data?) ->()) {
let VideoFilePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("mergeVideo\(arc4random()%1000)d").appendingPathExtension("mp4").absoluteString
if FileManager.default.fileExists(atPath: VideoFilePath) {
do {
try FileManager.default.removeItem(atPath: VideoFilePath)
} catch { }
}
let savePathUrl = URL(string: VideoFilePath)!
let sourceAsset = AVURLAsset(url: URL(string: originalVideoURL)! , options: nil)
let assetExport: AVAssetExportSession = AVAssetExportSession(asset: sourceAsset, presetName: AVAssetExportPresetMediumQuality)!
assetExport.outputFileType = AVFileType.mov
assetExport.outputURL = savePathUrl
assetExport.exportAsynchronously { () -> Void in
switch assetExport.status {
case AVAssetExportSession.Status.completed:
DispatchQueue.main.async(execute: {
do {
let videoData = try Data(contentsOf: savePathUrl, options: NSData.ReadingOptions())
//print("MB - \(Double(videoData.count) / (1024.0 * 1024.0))")
completion(videoData)
} catch {
print(error)
completion(nil)
}
})
case AVAssetExportSession.Status.failed:
print("failed \(String(describing: assetExport.error))")
case AVAssetExportSession.Status.cancelled:
print("cancelled \(String(describing: assetExport.error))")
default:
print("complete")
}
}
}
Это отлично работало до iOS 13, и даже с iOS 13 отлично работает на симуляторе, но когда я пробую на своем устройстве iPhone 11 Pro Max, я получаю AVAssetExportSession.Status.failed с сообщением «Операция не может быть завершена»
Я попытался изменить качество на AVAssetExportPresetLowQuality и High quality, но с той же ошибкой.
Эта функция вызывается из делегата imagePicker:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let mediaType = info[.mediaType] as? NSString {
if mediaType == kUTTypeMovie {
// video
if let videoURL = info[.mediaURL] as? URL {
self.mediaHelper.reduceVideoSize(videoURL.absoluteString, completion: { (data) in
if data != nil {
self.videoData = data
self.sideImage = image
}
})
}
}
}
picker.dismiss(animated: true) {
self.layoutIfNeeded()
}
}