В моем проекте мне нужно отредактировать видео.Я вырезал (по времени) и обрезал (по размеру), чтобы создать новое видео.Я использую AVAssetExportSession, чтобы сделать это.
Код работает хорошо, но после двадцати я получаю сообщение об ошибке.
func crop(toUrl cropUrl: URL, ratio: Ratio, _ completion: @escaping (_ outputUrl: URL?) -> Void) {
guard let videoTrack = self.tracks(withMediaType: AVMediaType.video).first else { return }
let composition = AVMutableVideoComposition()
composition.renderSize = CGSize(width: (videoTrack.naturalSize.height * ratio.width) + 1.0, height: videoTrack.naturalSize.height)
composition.frameDuration = CMTimeMake(value: 1, timescale: Int32(roundf(videoTrack.nominalFrameRate)))
let instruction = AVMutableVideoCompositionInstruction()
instruction.timeRange = CMTimeRangeMake(start: CMTime.zero, duration: self.duration)
let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
let transform = CGAffineTransform(translationX: -(videoTrack.naturalSize.width - videoTrack.naturalSize.height * ratio.width) / 2, y: 0.0)
layerInstruction.setTransform(transform, at: CMTime.zero)
instruction.layerInstructions = [layerInstruction]
composition.instructions = [instruction]
let exportSession = AVAssetExportSession(asset: self, presetName: AVAssetExportPreset1280x720)!
exportSession.videoComposition = composition
exportSession.outputURL = cropUrl
exportSession.outputFileType = AVFileType.mov
exportSession.exportAsynchronously( completionHandler: { () -> Void in
guard exportSession.status == .completed else {
print(exportSession.error.debugDescription)
DispatchQueue.main.async {
completion(nil)
}
return
}
DispatchQueue.main.async {
completion(exportSession.outputURL)
}
})
}
Ошибка:
Код AVFoundationErrorDomain = -11839 "Cannot Decode"и NSLocalizedFailureReason = Декодер, требуемый для этого носителя, занят., NSLocalizedRecoverySuggestion = Остановите любые другие действия, которые декодируют носитель, и попробуйте снова., NSLocalizedDescription = Невозможно декодировать
Так как я могу получить доступ к данным, все еще находящимся в процессев AVAssetExportSession?Могу ли я их освободить и как?Есть ли другой способ сделать это?
Спасибо!