Подтвердить что ты не робот

Обработчик завершения не вызывается на iOS7 GM

Я использую AVAssetWriter, и он отлично работает на iOS6.

Проблема в том, что когда я вызывал finishWritingWithCompletionHandler, обработчик завершения не вызывается в iOS7 GM.

Я назвал markAsFinished и даже endSessionAtSourceTime до того, как я назову finalWritingWithCompletionHandler.

Он отлично работает на iOS6.

И даже больше, на iOS7, он работает несколько раз, а затем он не работает снова.

Я не знаю почему, но он работает, если я вызываю метод с использованием предупреждения. Поэтому я попробовал performSelectorOnMainThread и inBackground, но это не помогло.

Любые идеи?

4b9b3361

Ответ 1

По-видимому, вам нужно сохранить ресурс-ресурс сейчас.

Вы можете попробовать сохранить с сильным свойством и посмотреть, вызван ли ваш обработчик завершения. (Обязательно запустите это свойство в обработчике завершения.)

Ответ 2

Рэй Фикс, ты прав. Нам нужно сохранить assetWriter. Самый простой способ - использовать его внутри блока finalWritingWithCompletionHandler:

        NSError *error = nil;

        AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:path]
                                                                   fileType:AVFileType3GPP
                                                                      error:&error];
        //startWriting, session etc.  

        [videoWriter finishWritingWithCompletionHandler:^{
                NSLog(@"%@",videoWriter);
                NSLog(@"Write Ended");
            }];

Ответ 3

Сохранение ассистента очень важно, но я также столкнулся с очень странным прерывистым провалом, хотя мои ассистенты были сохранены (и никогда не использовались повторно). Проблема также заключалась не в конфликте имени файла или отсутствующем каталоге, потому что мои имена файлов основаны на CACurrentMediaTime() и не меняют каталоги.

Кажется, вы не устанавливаете endSessionAtSourceTime: для ассемблера каждый раз, есть очень редкая (но воспроизводимая) вероятность того, что обработчик завершения для finishWritingWithCompletionHandler: никогда не будет вызван. Если вы подождете несколько секунд и проверьте статус ассистента, он будет находиться в состоянии AVAssetWriterStatusFailure, и ошибка будет не описана "Неизвестная ошибка (-12763)". Кроме того, изменение формата файла для ассистента не влияет на эту проблему. Наконец, эта проблема, вероятно, является проблемой только в том случае, если вам нужно быстро записывать фильмы снова и снова (поскольку вероятность сбоя, вероятно, составляет 1/15 - 1/20).

Итак, просто не забудьте сохранить метку времени представления для последнего образца, который вы передаете ассистенту, и вызвать endSessionAtSourceTime: с этим временем выборки прямо перед тем, как вы собираетесь называть finishWritingWithCompletionHandler:.

Ответ 4

Это также происходит на ARC.

Простейшим решением является определение свойств AVAssetWriter (и предполагаемого AVAssetReader)

@property(nonatomic,strong) AVAssetWriter *assetWriter;
@property(nonatomic,strong) AVAssetReader *assetReader;

а затем

self.assetWriter = [AVAssetWriter assetWriterWithURL:destURL
                                                       fileType:AVFileTypeWAVE
                                                          error:&assetError];

и в блоке завершения

              [assetWriterInput markAsFinished];
             [assetWriter finishWritingWithCompletionHandler:^{
                 [assetReader cancelReading];
                 completionBlock(self);

             }];

Ответ 5

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