0

レイヤーを含むアニメーションを作成し、そのアニメーションでビデオを書き出したいとします。 AVAssetExportSessionを使用しますが、エクスポートには時間がかかります。AVVideoCompositionCoreAnimationToolとAVAssetExportSessionでビデオを作成するSLOW

多分私は別のものを使うことができますか?私は本当に助けが必要です!私は、デバイスにエクスポートをテストするとき

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

"本当に長い時間"を定義します。 CPU(使用しているMacまたはiPhone)は輸出時間に影響します。アニメーションの数とスタイルもまた、エクスポート時間を増加させます。経験則として、1:1(60秒のビデオは60秒間のエクスポートに要する)以下のものはほぼ正しいです。サイズの問題! 640x360は1280x720よりも高速になります。 AVAssetExportSessionの代わりにAVAssetWriterに移動する(またはhttps://github.com/rs/SDAVAssetExportSessionを使用する)場合は、FrameとBitRatesもカスタマイズして、書き込みパフォーマンスと再生パフォーマンスの両方に影響します。 –

+0

実績のあるベンチマークを取得するには、アニメーションや変換なしでビデオをロードしてエクスポートするだけです。これは、あなたのデバイスがビデオの読み込みと書き出しができる「最小」の作業です。さまざまな長さの動画を試して、これをベースラインとして使用して、パフォーマンスへの影響を測定して評価してください。これは、幸運を助けることを望む! –

答えて

0

時間が多く減少し、それだけで私は20代がかかります。シミュレータでは、ほぼ2.5分かかります。

関連する問題