AVAssetExportSession exporta demasiado lento

Estoy intentando exportar una AVMutableComposition usando AVAssetExportSession .

 AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mutableComposition presetName:AVAssetExportPresetHighestQuality]; exporter.outputURL=url; exporter.outputFileType = AVFileTypeQuickTimeMovie; exporter.videoComposition = mainCompositionInst; exporter.shouldOptimizeForNetworkUse = YES; [exporter exportAsynchronouslyWithCompletionHandler:^ { switch (exporter.status) { case AVAssetExportSessionStatusCompleted: { NSLog(@"Video Merge SuccessFullt"); } break; case AVAssetExportSessionStatusFailed: NSLog(@"Failed:%@", exporter.error.description); break; case AVAssetExportSessionStatusCancelled: NSLog(@"Canceled:%@", exporter.error); break; case AVAssetExportSessionStatusExporting: NSLog(@"Exporting!"); break; case AVAssetExportSessionStatusWaiting: NSLog(@"Waiting"); break; default: break; } }]; 

Pero exportar videos de hasta 1 minuto lleva alnetworkingedor de 30 segundos, lo cual es demasiado, ya que la aplicación de camera incorporada en el iPad tarda less de 2 segundos.

Además, si videoComposition de videoComposition del exportador, el time se networkinguce a 7 segundos, lo que sigue siendo malo, teniendo en count que la duración del video es de solo 1 minuto. Entonces, ¿quiero saber cómo disminuir el time de export al mínimo?

Además, quiero saber, ¿ AVAssetExportSession generalmente toma tanto time o es solo mi caso?

Actualización : combinación de código:

AVMutableComposition * mutableComposition = [AVMutableComposition composition];

 AVMutableCompositionTrack *videoCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo prefernetworkingTrackID:kCMPersistentTrackID_Invalid]; AVMutableCompositionTrack *audioCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio prefernetworkingTrackID:kCMPersistentTrackID_Invalid]; AVMutableVideoCompositionLayerInstruction *videoTrackLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoCompositionTrack]; NSMutableArray *instructions = [NSMutableArray new]; CGSize size = CGSizeZero; CMTime time = kCMTimeZero; for (AVURLAsset *asset in assets) { AVAssetTrack *assetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; AVAssetTrack *audioAssetTrack = [asset tracksWithMediaType:AVMediaTypeAudio].firstObject; NSError *error; [videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, assetTrack.timeRange.duration ) ofTrack:assetTrack atTime:time error:&error]; [videoTrackLayerInstruction setTransform:assetTrack.prefernetworkingTransform atTime:time]; if (error) { NSLog(@"asset url :: %@",assetTrack.asset); NSLog(@"Error1 - %@", error.debugDescription); } [audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAssetTrack.timeRange.duration) ofTrack:audioAssetTrack atTime:time error:&error]; if (error) { NSLog(@"Error2 - %@", error.debugDescription); } time = CMTimeAdd(time, assetTrack.timeRange.duration); if (CGSizeEqualToSize(size, CGSizeZero)) { size = assetTrack.naturalSize; } } AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, time); mainInstruction.layerInstructions = [NSArray arrayWithObject:videoTrackLayerInstruction]; AVMutableVideoComposition *mainCompositionInst = [AVMutableVideoComposition videoComposition]; mainCompositionInst.instructions = [NSArray arrayWithObject:mainInstruction]; mainCompositionInst.frameDuration = CMTimeMake(1, 30); mainCompositionInst.renderSize = size; 

Construí una aplicación que combinaba diferentes fragments de video y puedo decir que es tu caso. Mis files de video tienen ~ 10 mb, así que quizás sean un poco más pequeños, pero toma less de segundos fusionarlos todos, incluso si hay 10, 20 segmentos.

Ahora que está sucediendo realmente, he comprobado mi configuration contra la tuya y la diferencia sigue:

  • Yo uso export.outputFileType = AVFileTypeMPEG4
  • Tengo la optimization de la networking deshabilitada, y si no planeas transmitir el video desde tu dispositivo, también debes deshabilitarlo.

Aparte de eso, debería ser el mismo, realmente no puedo compararlo, ya que tendrías que proporcionar código sobre cómo crear la composition. Sin embargo, hay algunas cosas para comprobar:

  • si está utilizando AVURLAssetPreferPreciseDurationAndTimingKey al crear AVURLAsset y no tiene bastantes fotogtwigs key, en realidad puede llevar bastante time search para encontrar las keys y, por lo tanto, lo ralentiza
  • Considera si realmente necesitas la mejor calidad para el video.
  • Considere la posibilidad de resolver el video y posiblemente networkingucirlo

Debería poder ayudarlo más si proporciona más información, pero tal vez algunas de estas cosas funcionen. Pruébelo e informe de nuevo.

Espero que ayude un poco!

Edición 1: Me olvidé de mencionar que si no tiene opciones, debe intentar usar la biblioteca FFmpeg , ya que es un performance muy alto, aunque debido a las licencias podría no ser adecuado para usted.