2012-06-18 4 views
14

Ich habe eine App, die eine AVMutableComposition in eine .mov Datei exportiert, und ich möchte, dass der Benutzer den Status des Exports mit einer Fortschrittsleiste auf die gleiche Weise sehen, wenn Sie gesendet würden eine Textnachricht oder eine Datei hochgeladen.Fortschrittsbalken für AVAssetExportSession

Ich weiß, wie ich einen Fortschrittsbalken erstellen kann, wenn ich die Dauer einer Aufgabe kenne (z. B. Abspielen einer Audiodatei), aber da es keine festgelegte Dauer für den Export gibt, bin ich mir nicht sicher.

Ich habe derzeit einen Aktivitätsindikator, aber es bietet nicht die beste Benutzererfahrung.

Hat jemand irgendwelche Zeiger?

Antwort

29

kam ich mit einer Antwort auf eine Weile zurück, so werde ich es im Falle schreiben kann jemand helfen:

Zuerst wird in dem Verfahren, in dem Sie anrufen AVAssetExportSession Sie haben einen Timer einzurichten, aktualisieren Sie Ihre UIProgressView, sobald Sie den Export begonnen haben:

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

Dann benötigen Sie eine Methode, um Ihre Anzeige zu aktualisieren zu berücksichtigen, dass der Fortschritt Eigenschaft auf AVAssetExportSession von 0 geht - 1:

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

rufen Sie 'self.exportProgressBarTimer =' innerhalb oder außerhalb des 'exportAsynchronouslyWithCompletionHandler' Block? 'self.exportSession.progress' wird für mich immer als 1.0 in' updateExportDisplay' angezeigt. –

+0

Außerhalb des Bausteins 'exportAsynchronicallyWithCompletionHandler'. Es funktioniert wunderbar für mich. –

2

gleiche Problem i 8.0 in iOS konfrontiert, aufgelöst ich es Versand 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

Verwenden Sie den folgenden Codezeilen verwenden.

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; 
     }); 
    } 
}); 

Referenz-Link: https://github.com/keijiro/iOS4BookSampleCode/blob/master/3.3.SimpleExport/Classes/SimpleExportViewController.m