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.

Спасибо.

0 ответов

Другие вопросы по тегам