Индикатор выполнения для AVAssetExportSession - программирование
Подтвердить что ты не робот

Индикатор выполнения для AVAssetExportSession

У меня есть приложение, которое экспортирует AVMutableComposition в файл .mov, и я хотел бы, чтобы пользователь видел статус экспорта с индикатором выполнения так же, как если бы вы отправили текстовое сообщение или загруженный файл.

Я знаю, как создать индикатор выполнения, когда я знаю длительность задачи (например, воспроизведение аудиофайла), но поскольку для экспорта нет установленной продолжительности, я не уверен, как это сделать.

В настоящее время у меня есть индикатор активности, но он не обеспечивает лучший пользовательский интерфейс.

Есть ли у кого-нибудь указатели?

4b9b3361

Ответ 1

Я подошел с ответом некоторое время назад, поэтому я отправлю его на случай, если он может кому-то помочь:

Во-первых, в методе, в котором вы вызываете AVAssetExportSession, вам нужно настроить таймер для обновления UIProgressView после запуска экспорта:

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

Затем вам понадобится метод обновления вашего дисплея с учетом того, что свойство progress на AVAssetExportSession идет от 0 до 1:

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

Ответ 2

Такая же проблема, с которой я столкнулся в iOS 8.0, я разрешил ее с помощью отправки 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];
 });

}

Ответ 3

Используйте строки ниже кода.

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

Ссылка ссылки: https://github.com/keijiro/iOS4BookSampleCode/blob/master/3.3.SimpleExport/Classes/SimpleExportViewController.m