AVAssetExportSession не работает в ios5
В моем приложении я объединяю два аудиофайла, используя 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 ответа
Я разобрался с ответом для себя и хотел бы поделиться им с другими, кто испытывает ту же проблему.
Проблема в том, что по какой-то причине AVAssetExportPresetPassthrough
не работает должным образом в ios5. Подставляя это AVAssetExportPresetAppleM4A
решил проблему.
Но теперь экспорт занимает больше времени.
В качестве обходного пути я обнаружил, что использование.mov в качестве расширения файла, а затем переименование его обратно в mp3, похоже, работает. Мне не нужно делать это для файлов M4A.
Возможно, существует способ использовать AVAssetWriter напрямую и не использовать AVAssetExportSession. Пожалуйста, пожалуйста, подайте ошибку на http://bugreport.apple.com/ чтобы, возможно, она была исправлена в следующей версии iOS5. (Я подал один из моих собственных, но чем больше, тем лучше.)