Я пишу приложение, которое работает с видео с помощью 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?