0

Ich erstelle eine Animation mit Ebenen und möchte ein Video mit diesen Animationen exportieren. Also verwende ich AVAssetExportSession, aber es dauert sehr lange zu exportieren.Erstellen Sie ein Video mit AVVideoCompositionCoreAnimationTool und AVAssetExportSession SLOW

Vielleicht kann ich eine andere Sache verwenden? Ich brauche wirklich Hilfe!

let videoURL = NSURL.init(fileURLWithPath: "/Users/Downloads/img_2040.mp4") 
    let audioURL = NSURL.init(fileURLWithPath: "/Users/Downloads/music_10sm.m4a") 

    let videoAsset = AVURLAsset.init(url: videoURL as URL) 
    let audioAsset = AVURLAsset.init(url: audioURL as URL) 

    let mixComposition = AVMutableComposition.init() 
    let compositionVideoTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) 
    // let mixCompositionAudio = AVMutableComposition.init() 
    let compositionAudioTrack = mixComposition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) 
    // AVAssetTrack video of originalVideo 
    let originalVideoAsset = videoAsset.tracks(withMediaType: AVMediaTypeVideo).first 
    let originalAudioAsset = audioAsset.tracks(withMediaType: AVMediaTypeAudio).first 

    do { 
     try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: originalVideoAsset!, at: kCMTimeZero) 
     compositionVideoTrack.preferredTransform = (videoAsset.tracks(withMediaType: AVMediaTypeVideo).first?.preferredTransform)! 

     try compositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, audioAsset.duration), of: originalAudioAsset!, at: kCMTimeZero) 
     compositionAudioTrack.preferredTransform = (audioAsset.tracks(withMediaType: AVMediaTypeAudio).first?.preferredTransform)! 

     let videoSize = originalVideoAsset?.naturalSize 
     let parentLayer = CALayer() 
     let videoLayer = CALayer() 
     parentLayer.bounds = CGRect(x: 0, y: 0, width: (videoSize?.width)!, height: (videoSize?.height)!) 
     parentLayer.position = CGPoint(x: (videoSize?.width)!/2, y: (videoSize?.height)!/2) 
     videoLayer.bounds = CGRect(x: 0, y: 0, width: (videoSize?.width)!, height: (videoSize?.height)!) 
     videoLayer.position = CGPoint(x: (videoSize?.width)!/2 + 20, y: (videoSize?.height)!/2) 
     let layerTest = CALayer() 
     layerTest.bounds = CGRect(x: 0, y: 0, width: 100, height: 100) 
     layerTest.backgroundColor = UIColor.green.cgColor 

     parentLayer.addSublayer(videoLayer) 
     parentLayer.insertSublayer(layerTest, below: videoLayer) 

     // My layer with animations 
     let cubeLayer = cubeAnimation(videoSize: containerLayer.frame.size, isVideo: true) 
     containerLayer.addSublayer(cubeLayer) 

     parentLayer.addSublayer(containerLayer) 
     parentLayer.isGeometryFlipped = true 

     let videoComposition = AVMutableVideoComposition.init() 
     videoComposition.renderSize = videoSize! 
     videoComposition.frameDuration = CMTimeMake(1, 30) 
     videoComposition.animationTool = AVVideoCompositionCoreAnimationTool.init(postProcessingAsVideoLayer: videoLayer, in: parentLayer) 

     // Instruction 
     let instruction = AVMutableVideoCompositionInstruction.init() 
     instruction.timeRange = CMTimeRangeMake(kCMTimeZero, mixComposition.duration) // TEST CAMBIAR ESTA DURATION 
     // Video 
     let videoTrack = mixComposition.tracks(withMediaType: AVMediaTypeVideo).first 
     let layerInstructions = AVMutableVideoCompositionLayerInstruction.init(assetTrack: videoTrack!) 

     instruction.layerInstructions = [layerInstructions] 
     videoComposition.instructions = [instruction] 

     let assetExport = AVAssetExportSession.init(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) 
     assetExport?.videoComposition = videoComposition 

     let exportPath = "/Users/CarolinaAitcin/Downloads/Test_ScrollBest91.mp4" 
     let exportUrl = URL.init(fileURLWithPath: exportPath) 

     assetExport?.outputFileType = AVFileTypeQuickTimeMovie 
     assetExport?.outputURL = exportUrl 
     assetExport?.shouldOptimizeForNetworkUse = true 

     assetExport?.exportAsynchronously { 
      print("Finish video") 
      print(NSDate()) 
     } 

     Timer.schedule(repeatInterval: 1, handler: { (runTime) in 
      let progress = assetExport?.progress 
      print(progress) 
     }) 
    } catch { 
     print("we have problem") 
    } 
+0

Definieren Sie "eine wirklich lange Zeit". CPU (welches Mac oder iPhone du verwendest) hat Auswirkungen auf die Exportzeiten. Die Anzahl und Art der Animationen erhöht auch die Exportzeiten. Als Faustregel gilt, dass alles unter 1: 1 (60 Sekunden Video dauert 60 Sekunden zum Export) ungefähr richtig ist. Die Größe ist wichtig! 640x360 wird viel schneller sein als 1280x720. Wenn Sie zu AVAssetWriter anstelle von AVAssetExportSession wechseln (oder https://github.com/rs/SDAVAssetExportSession verwenden), können Sie auch Frame- und BitRates anpassen, die sich sowohl auf die Schreib- als auch auf die Wiedergabe-Leistung auswirken. –

+0

Um eine solide Benchmark zu erhalten, laden Sie einfach und exportieren Sie Ihr Video ohne Animationen oder Transformationen. Dies ist die "geringste" Arbeit, die Ihr Gerät leisten kann, um das Video zu lesen und zu schreiben. Probieren Sie ein paar Videos in verschiedenen Längen aus und verwenden Sie dies als Basis für die Messung und Bewertung der Auswirkungen auf die Leistung. Hoffe, das hilft, viel Glück! –

Antwort

0

Wenn ich den Export in einem Gerät testen, hat sich die Zeit stark verringert, ich brauche nur 20s. Im Simulator dauert fast 2,5 Minuten.

Verwandte Themen