AVAssetExportSession не работает в ios5 - PullRequest
1 голос
/ 05 ноября 2011

В моем приложении я объединяю два аудиофайла, используя AVAssetExportSession, и он отлично работает в более ранних версиях ios. Но на устройстве ios5 это не работает. То, что я получаю, является ошибкой

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

Код, который я использую для экспорта, указан ниже

Кто-нибудь испытывал такую ​​же проблему? Пожалуйста, предоставьте ваши ценные предложения. Мне нужно срочно решить эту проблему ..

//Export function to export the combined audios as one.
-(void)exportAudioFile:(AVComposition*)combinedComposition
{
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:combinedComposition
                                                                           presetName:AVAssetExportPresetPassthrough];
    NSArray *presets =[AVAssetExportSession exportPresetsCompatibleWithAsset:combinedComposition];
    NSLog(@"presets======%@",presets);
    NSLog (@"can export: %@", exportSession.supportedFileTypes);
    NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectoryPath = [dirs objectAtIndex:0];
    exportPath = [documentsDirectoryPath stringByAppendingPathComponent:@"CombinedNew.m4a"];
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
    exportURL = [NSURL fileURLWithPath:exportPath];
    exportSession.outputURL = exportURL;
    exportSession.outputFileType = @"com.apple.m4a-audio";
    exportSession.shouldOptimizeForNetworkUse = YES;
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        NSLog (@"i is in your block, exportin. status is %d",
               exportSession.status);
        switch (exportSession.status) 
        {
            case AVAssetExportSessionStatusFailed: 
            {
                // log error to text view
                NSError *exportError = exportSession.error;
                DEBUG_LOG(@"AVAssetExportSessionStatusFailed: %@", exportError);
                [self enableUI];
                break;
            }
            case AVAssetExportSessionStatusCompleted: 
            {
                DEBUG_LOG(@"AVAssetExportSessionStatusCompleted");
                DEBUG_LOG(@"Completed export");
                exportSuccess = YES;
                if (recorderFilePath) 
                {
                    NSError *finalurlError;
                    [[NSFileManager defaultManager]removeItemAtPath:recorderFilePath  error:&finalurlError];
                    finalurlError = nil;
                    [[NSFileManager defaultManager]copyItemAtPath:[exportURL path] toPath:recorderFilePath error:&finalurlError];
                }
                isExported = YES;
                fileUrl = [NSURL fileURLWithPath:recorderFilePath];  
                [self performSelectorInBackground:@selector(updatePlayerForUrl:) withObject:fileUrl];
                break;
            }
            case AVAssetExportSessionStatusUnknown: 
            {   
                DEBUG_LOG(@"AVAssetExportSessionStatusUnknown");                 
                break;
            }
            case AVAssetExportSessionStatusExporting: 
            { 
                DEBUG_LOG(@"AVAssetExportSessionStatusExporting");                 
                break;
            }
            case AVAssetExportSessionStatusCancelled: 
            { 
                DEBUG_LOG(@"AVAssetExportSessionStatusCancelled");
                break;
            }
            case AVAssetExportSessionStatusWaiting: 
            { 
                DEBUG_LOG(@"AVAssetExportSessionStatusWaiting");                 
                break;
            }
            default: 
            { 
                DEBUG_LOG(@"didn't get export status");                
                break;
            }

        };
    }];
    [exportSession release];
}

Ответы [ 3 ]

6 голосов
/ 06 ноября 2011

Я разобрался с ответом для себя и хотел бы поделиться им с другими, кто испытывает ту же проблему.

Проблема в том, что по какой-то причине AVAssetExportPresetPassthrough не работает должным образом в ios5. Замена на AVAssetExportPresetAppleM4A решила проблему.
Но теперь экспорт занимает больше времени.

1 голос
/ 19 марта 2012

В качестве обходного пути я обнаружил, что использование .mov в качестве расширения файла, а затем переименование его обратно в mp3, похоже, работает. Мне не нужно делать это для файлов m4a.

1 голос
/ 29 ноября 2011

Возможно, существует способ использовать AVAssetWriter напрямую и не использовать AVAssetExportSession.Пожалуйста, пожалуйста, сообщите об ошибке в http://bugreport.apple.com, чтобы, возможно, она была исправлена ​​в следующей версии iOS5.(Я подал один из своих, но чем больше, тем лучше.)

...