Ответ 1
По-видимому, вам нужно сохранить ресурс-ресурс сейчас.
Вы можете попробовать сохранить с сильным свойством и посмотреть, вызван ли ваш обработчик завершения. (Обязательно запустите это свойство в обработчике завершения.)
Я использую AVAssetWriter, и он отлично работает на iOS6.
Проблема в том, что когда я вызывал finishWritingWithCompletionHandler
, обработчик завершения не вызывается в iOS7 GM.
Я назвал markAsFinished
и даже endSessionAtSourceTime
до того, как я назову finalWritingWithCompletionHandler.
Он отлично работает на iOS6.
И даже больше, на iOS7, он работает несколько раз, а затем он не работает снова.
Я не знаю почему, но он работает, если я вызываю метод с использованием предупреждения.
Поэтому я попробовал performSelectorOnMainThread
и inBackground
, но это не помогло.
Любые идеи?
По-видимому, вам нужно сохранить ресурс-ресурс сейчас.
Вы можете попробовать сохранить с сильным свойством и посмотреть, вызван ли ваш обработчик завершения. (Обязательно запустите это свойство в обработчике завершения.)
Рэй Фикс, ты прав. Нам нужно сохранить 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");
}];
Сохранение ассистента очень важно, но я также столкнулся с очень странным прерывистым провалом, хотя мои ассистенты были сохранены (и никогда не использовались повторно). Проблема также заключалась не в конфликте имени файла или отсутствующем каталоге, потому что мои имена файлов основаны на CACurrentMediaTime() и не меняют каталоги.
Кажется, вы не устанавливаете endSessionAtSourceTime:
для ассемблера каждый раз, есть очень редкая (но воспроизводимая) вероятность того, что обработчик завершения для finishWritingWithCompletionHandler:
никогда не будет вызван. Если вы подождете несколько секунд и проверьте статус ассистента, он будет находиться в состоянии AVAssetWriterStatusFailure, и ошибка будет не описана "Неизвестная ошибка (-12763)". Кроме того, изменение формата файла для ассистента не влияет на эту проблему. Наконец, эта проблема, вероятно, является проблемой только в том случае, если вам нужно быстро записывать фильмы снова и снова (поскольку вероятность сбоя, вероятно, составляет 1/15 - 1/20).
Итак, просто не забудьте сохранить метку времени представления для последнего образца, который вы передаете ассистенту, и вызвать endSessionAtSourceTime:
с этим временем выборки прямо перед тем, как вы собираетесь называть finishWritingWithCompletionHandler:
.
Это также происходит на 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);
}];
Это также может произойти, если каталог назначения не существует. В этом случае запись работает нормально, но файл не создается и блок не вызывается.