Swift - обрезка видео и обрезка до квадратного процессора
У меня есть функция, которая принимает в качестве входного URL-адрес видео и по завершении имеет выходной URL отредактированного видео.
По сути, функция создает видео квадратной формы, и если длина видео превышает 30 секунд, обрежьте его до 30 секунд.
Вот функция:
func compressVideo(inputURL: URL, outputURL: URL, handler:@escaping (_ exportSession: AVAssetExportSession?)-> Void) {
let urlAsset = AVURLAsset(url: inputURL as URL, options: nil)
guard let exportSession = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetMediumQuality) else {
handler(nil)
return
}
let clipVideoTrack = urlAsset.tracks( withMediaType: AVMediaType.video ).first! as AVAssetTrack
let composition = AVMutableComposition()
composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: CMPersistentTrackID())
let videoComposition = AVMutableVideoComposition()
videoComposition.renderSize = CGSize( width: clipVideoTrack.naturalSize.height, height: clipVideoTrack.naturalSize.height )
videoComposition.frameDuration = CMTimeMake(1, 30)
let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack)
let instruction = AVMutableVideoCompositionInstruction()
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30))
let transform1: CGAffineTransform = CGAffineTransform(translationX: clipVideoTrack.naturalSize.height, y: (clipVideoTrack.naturalSize.width - clipVideoTrack.naturalSize.height) / 2)
let transform2 = transform1.rotated(by: .pi/2)
let finalTransform = transform2
transformer.setTransform(finalTransform, at: kCMTimeZero)
instruction.layerInstructions = [transformer]
videoComposition.instructions = [instruction]
let timescale = urlAsset.duration.timescale
let duration = CMTimeGetSeconds(urlAsset.duration)
if (duration < 31.0) {
print("minore")
} else {
let startTime = CMTimeMakeWithSeconds(0, timescale)
let stopTime = CMTimeMakeWithSeconds(30, timescale)
let exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime)
exportSession.timeRange = exportTimeRange
print("maggiore")
}
exportSession.outputURL = outputURL
exportSession.outputFileType = AVFileType.mov
exportSession.videoComposition = videoComposition
exportSession.shouldOptimizeForNetworkUse = true
exportSession.exportAsynchronously { () -> Void in
handler(exportSession)
}
}
Пока что я тестировал его только на симуляторе. Функция работает нормально, но я заметил, что использование процессора очень высоко. Дошло до 300% и более. При этом использование памяти увеличилось до 414 МБ. Я что-то пропустил? Так должно быть или я делаю какую-то ошибку? Есть ли способ уменьшить использование процессора и, следовательно, время ожидания. Я новичок в Swift, и я впервые работаю с видео и AVFoundation.
Спасибо.