Фреймворк AVFoundation требует задержки для создания миниатюр - PullRequest
1 голос
/ 26 марта 2012

Я использую инфраструктуру AVFoundation в своем приложении для iPad для записи видео. Когда запись видео завершена, я создаю миниатюрное изображение для того же видео с помощью AVFoundation. Но если я записываю два видео без большой задержки между ними, миниатюра не создан должным образом. Очевидно, что это требует некоторой задержки. Как избежать этого или хотя бы как узнать, когда миниатюра предыдущего видео была полностью создана, чтобы я мог показать некоторый символ «Ожидание» пользователю за этот период времени?

Пожалуйста, помогите, поскольку я понятия не имею, как решить проблему.

//delegate method which gets called when recording ends.
//Here I create the thumb and store it in self.thumb
-(void)recorder:(AVCamRecorder *)recorder recordingDidFinishToOutputFileURL:(NSURL *)outputFileURL error:(NSError *)error
{
    self.thumb=nil;
    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:outputFileURL options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform=TRUE;
    [asset release];
    CMTime thumbTime = CMTimeMakeWithSeconds(0,1);

    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
        if (result != AVAssetImageGeneratorSucceeded) {
            NSLog(@"couldn't generate thumbnail, error:%@", error);
        }

         self.thumb=[UIImage imageWithCGImage:im];

        [generator release];
    };

    CGSize maxSize = CGSizeMake(320, 180);
    generator.maximumSize = maxSize;
    [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
        [[UIApplication sharedApplication] endBackgroundTask:[self backgroundRecordingID]];
    }       

    if ([[self delegate] respondsToSelector:@selector(captureManagerRecordingFinished:)]) {
        [[self delegate] captureManagerRecordingFinished:self];
    }
}


[self copyFileToDocuments:outputFileURL];
}


//Save video and thumbnail to documents
- (void) copyFileToDocuments:(NSURL *)fileURL
{
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd_HH-mm-ss"];
NSString *destinationPath = [documentsDirectory stringByAppendingFormat:@"/output_%@.mov", [dateFormatter stringFromDate:[NSDate date]]];
[dateFormatter release];
NSError *error;
if (![[NSFileManager defaultManager] copyItemAtURL:fileURL toURL:[NSURL fileURLWithPath:destinationPath] error:&error]) {
    if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)]) {
        [[self delegate] captureManager:self didFailWithError:error];
    }
}
else
{
    destinationPath=[[destinationPath lastPathComponent]stringByDeletingPathExtension];
    [self saveImage:self.thumb withName:destinationPath];
}

}

    //Method Where I save  self.thumb in app documents
-(void) saveImage:(UIImage*)image withName:(NSString*)fileName
{
NSFileManager *fileManager = [NSFileManager defaultManager];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];
   //Save Image
NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.

NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",fileName]];

[fileManager createFileAtPath:fullPath contents:imageData attributes:nil];

}

Выше мой код. Но self.thumb не будет должным образом сохранен, если я не задержу две записи.

1 Ответ

0 голосов
/ 28 марта 2012

Я использовал другой метод. Когда пользователь нажимает «Запись», я сначала щелкаю фотографию с камеры, а затем начинаю записывать видео. Позже я использую ту же фотографию в качестве эскиза.

Я знаю, что это не таклучший подход, но самое лучшее - это его работа;)

Надеюсь, это поможет кому-то с такой же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...