Ошибка AVAssetExportSession -11820

Я пишу приложение, которое работает с видео с помощью AVFoundation.

Поведение моего приложения простое: я беру видео из рулона камеры, затем создаю AVMutableComposition с некоторыми звуковыми дорожками. С составом микширования я инициализируйте AVAssetExportSession, который хранит видеофайл в каталоге документов моего приложения.

До этого момента все в порядке: мое видео хранится, и я могу воспроизвести его на другом контроллере. Если я возьму видео, которое я только что сохранил в папке моих документов, чтобы сделать некоторое редактирование (так же, как и первый раз AVmutableComposition, AVAssetExportSession), он снова подходит.

Но в третий раз, когда я делаю этот процесс для редактирования видео, статус AVAssetExportSession становится "Fail" и с этой ошибкой:

"Domain=AVFoundationErrorDomain Code=-11820 "Cannot Complete Export" UserInfo=0x1a9260 {NSLocalizedRecoverySuggestion=Try exporting again., NSLocalizedDescription=Cannot Complete Export}"

Я прочитал, что это общая ошибка, когда сеанс не может быть экспортирован. В чем смысл этого? Почему только в третий раз я сделал процесс редактирования? Может быть, это ошибка управления памятью? Жук?. Это код моего AVAssetExportSession:

 _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];   
_assetExport.shouldOptimizeForNetworkUse = YES;

///data odierna
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"ddMMyyyyHHmmss"];

NSDate *now = [[NSDate alloc] init];

NSString *dateString = [format stringFromDate:now];
[now release];
[format release];
NSString* ext = @".MOV";
NSString* videoName=[NSString stringWithFormat:@"%@%@", dateString, ext];

///data odierna
NSString *exportPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:videoName];

if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) 
{
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}


_assetExport.outputFileType = AVFileTypeQuickTimeMovie;

[_assetExport setTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)];
NSURL    *exportUrl = [NSURL fileURLWithPath:exportPath] ;

_assetExport.outputURL = exportUrl ;

[_assetExport exportAsynchronouslyWithCompletionHandler:^
{
    switch (_assetExport.status) 
    {
        case AVAssetExportSessionStatusFailed:
        {
            NSLog (@"FAIL %@",_assetExport.error);
            if ([[NSFileManager defaultManager] fileExistsAtPath:[_assetExport.outputURL path]]) 
            {
                [[NSFileManager defaultManager] removeItemAtPath:[_assetExport.outputURL path] error:nil];
            }

            [self performSelectorOnMainThread:@selector (ritenta)
                                   withObject:nil
                                waitUntilDone:NO];
            break;
        }
        case AVAssetExportSessionStatusCompleted: 
        {
            NSLog (@"SUCCESS");

            [self performSelectorOnMainThread:@selector (saveVideoToAlbum:)
                                   withObject:exportPath
                                waitUntilDone:NO];
            break;
        }
        case AVAssetExportSessionStatusCancelled: 
        {
            NSLog (@"CANCELED");

            break;
        }
    };
}];

Я сделал много запросов в Интернете, некоторые люди столкнулись с проблемой в outputURL сеанса, но я пробовал и, кажется, все в порядке в моем коде. Чтобы назначить уникальное имя файлу, я использую NSDate. Для целей отладки я попытался восстановить стандартное имя строки, но проблема остается. Есть идеи? Может ли кто-нибудь предложить мне альтернативный метод для экспорта в папку документов, когда актив с AssetWriter инсталлировал AVassetExportSession?

Ответ 1

Проблема: _assetExport.outputFileType вы установили тип AVFileTypeQuickTimeMovie. Который вряд ли будет поддерживаться.

Попробуйте выяснить, какие типы выходных файлов поддерживаются _assetExport, используя следующий код и используя подходящий.

NSLog (@"created exporter. supportedFileTypes: %@", exporter.supportedFileTypes);

OR
просто измените

_assetExport.outputFileType = AVFileTypeQuickTimeMovie;

К

exporter.outputFileType = @"com.apple.m4a-audio";

Также не забудьте изменить расширение из

NSString* ext = @".MOV";  to @".m4a" 

Это должно сработать. Это сработало для меня.