AVAssetExportSession exportAsynchronouslyWithCompletionHandler: method Not Called

Estoy combinando dos grabaciones de audio (grabadas usando AVAudioRecorder ) en un solo file. El uso de AVAssetExportSession para exportar el file combinado funciona perfectamente la primera vez (es decir, mientras esté en el controller de vista actual). Pero cuando vuelve a cargar esta vista (una nueva session), el método AVAssetExportSession exportAsynchronouslyWithCompletionHandler : no se AVAssetExportSession exportAsynchronouslyWithCompletionHandler en absoluto (no ¡Llámame!) Sin errores, nada … Intenté registrar el object AVAssetExportSession, lo conseguí la primera vez

 <AVAssetExportSession: 0x155b3250, asset = <AVMutableComposition: 0x156474c0 tracks = ("<AVMutableCompositionTrack: 0x156a0bb0 trackID = 1, mediaType = soun, editCount = 0>")>, presetName = AVAssetExportPresetAppleM4A, outputFileType = (null) 

y esta la segunda vez

 <AVAssetExportSession: 0x1559e840, asset = <AVMutableComposition: 0x155f7f30 tracks = ("<AVMutableCompositionTrack: 0x155f0120 trackID = 1, mediaType = soun, editCount = 1>")>, presetName = AVAssetExportPresetAppleM4A, outputFileType = (null) 

La única diferencia que noté es la edición = 1 cosa.

Sé que suena confuso, es para mí. ¿Qué pasa aquí?

Mi código:

 AVAssetExportSession* exportSession = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetAppleM4A]; NSLog(@"exportSession: %@", exportSession); exportSession.outputURL = [NSURL fileURLWithPath:combined]; exportSession.outputFileType = AVFileTypeAppleM4A; exportSession.shouldOptimizeForNetworkUse = YES; [exportSession exportAsynchronouslyWithCompletionHandler:^{ switch (exportSession.status) { case AVAssetExportSessionStatusFailed: NSLog(@"AVAssetExportSessionStatusFailed"); break; case AVAssetExportSessionStatusCompleted: NSLog(@"AVAssetExportSessionStatusCompleted"); break; case AVAssetExportSessionStatusWaiting: NSLog(@"AVAssetExportSessionStatusWaiting"); break; default: break; } dispatch_async(dispatch_get_main_queue(), ^{ [self exportDidFinish:exportSession]; }); }]; 

Puede o no estar relacionado, pero he tenido un problema similar con los videos. El bloque de finalización no se activará si la session de export no tiene información correcta sobre la hora y la duración de inicio de AVAsset . La única solución que encontré fue search en una pequeña cantidad de time para cada recurso al agregarlos a la pista de composition ( CMTimeRangeMake() ). No es ideal

Funciona correctamente.

 [exportSession exportAsynchronouslyWithCompletionHandler:^{ dispatch_async(dispatch_get_main_queue(), ^{ switch (exportSession.status) { case AVAssetExportSessionStatusFailed: NSLog(@"AVAssetExportSessionStatusFailed"); break; case AVAssetExportSessionStatusCompleted: NSLog(@"AVAssetExportSessionStatusCompleted"); [self exportDidFinish:exportSession]; break; case AVAssetExportSessionStatusWaiting: NSLog(@"AVAssetExportSessionStatusWaiting"); break; default: break; } }); }];