2012-06-18 28 views
14

Tengo una aplicación que exporta un AVMutableComposition en un archivo .mov, y me gustaría que el usuario vea el estado de la exportación con una barra de progreso de la misma manera que si enviara un mensaje de texto o cargado un archivo.Barra de progreso para AVAssetExportSession

Sé cómo crear una barra de progreso cuando sé la duración de una tarea (como reproducir un archivo de audio), pero como no hay una duración establecida para la exportación, no estoy seguro de cómo proceder.

Tengo un indicador de actividad actualmente pero no proporciona la mejor experiencia de usuario.

¿Alguien tiene punteros?

Respuesta

29

me ocurrió una respuesta hace un tiempo por lo que voy a publicar en caso de que puede ayudar a alguien:

En primer lugar, en el método en el que se llama a AVAssetExportSession tienes que configurar un temporizador para actualizar su UIProgressView una vez que se haya iniciado la exportación:

//`AVAssetExportSession` code here 
    self.exportProgressBarTimer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(updateExportDisplay) userInfo:nil repeats:YES]; 
... 

Luego hay un método para actualizar la pantalla teniendo en cuenta que la propiedad avances en AVAssetExportSession va de 0 juego - 1:

- (void)updateExportDisplay { 
    self.exportProgressBar.progress = exportSession.progress; 
    if (self.exportProgressBar.progress > .99) { 
     [self.exportProgressBarTimer invalidate]; 
    } 
} 
+0

son usted que llama '' self.exportProgressBarTimer = dentro o fuera del bloque 'exportAsynchronouslyWithCompletionHandler'? 'self.exportSession.progress' siempre muestra como 1.0 en' updateExportDisplay' para mí. –

+0

Fuera del bloque 'exportAsynchronouslyWithCompletionHandler'. Está funcionando maravillosamente para mí. –

2

mismo problema que he enfrentado en iOS 8.0, i resolvió mediante el envío quee

- (void)convertVideoToLowQuailtyWithInputURL:(NSURL*)inputURL outputURL:(NSURL*)outputURL handler:(void (^)(AVAssetExportSession*))handler{ 

[[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil]; 
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil]; 

exportSession2 = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetLowQuality]; 
exportSession2.outputURL = outputURL; 
exportSession2.outputFileType = AVFileTypeQuickTimeMovie; 

[exportSession2 exportAsynchronouslyWithCompletionHandler:^(void) 
{ 
    handler(exportSession2); 
}]; 

dispatch_async(dispatch_get_main_queue(), ^(void){ 

     self.exportProgressBarTimer = [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(updateExportDisplay) userInfo:nil repeats:YES]; 
}); 

}

1

uso por debajo de líneas de código.

AVAssetExportSession *session = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetMediumQuality]; 
self.exportSession = session; 

// 出力先(テンポラリファイル)の設定。 
NSString *filePath = NSTemporaryDirectory(); 
filePath = [filePath stringByAppendingPathComponent:@"out.mov"]; 
[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil]; 
session.outputURL = [NSURL fileURLWithPath:filePath]; 

// 出力タイプの設定。 
session.outputFileType = AVFileTypeQuickTimeMovie; 

// 非同期エクスポートの開始。 
[session exportAsynchronouslyWithCompletionHandler:^{ 
    if (session.status == AVAssetExportSessionStatusCompleted) { 
     // フォトアルバムへの書き込み。 
     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
     [library writeVideoAtPathToSavedPhotosAlbum:session.outputURL completionBlock:^(NSURL *assetURL, NSError *error){ 
      if (error) { 
       self.resultLabel.text = [NSString stringWithFormat:@"アセット書き込み失敗\n%@", error]; 
      } else { 
       self.resultLabel.text = [NSString stringWithFormat:@"完了\n%@", assetURL]; 
      } 
     }]; 
     [library autorelease]; 
    } else if (session.status == AVAssetExportSessionStatusCancelled) { 
     self.resultLabel.text = @"エクスポート中断"; 
    } else { 
     self.resultLabel.text = [NSString stringWithFormat:@"エクスポート失敗\n%@", session.error]; 
    } 
}]; 


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    while (session.status == AVAssetExportSessionStatusExporting) { 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      self.progressView.progress = session.progress; 
     }); 
    } 
}); 

Reference Enlace: https://github.com/keijiro/iOS4BookSampleCode/blob/master/3.3.SimpleExport/Classes/SimpleExportViewController.m