AVFoundation框架会延迟创建缩略图



我在iPad应用程序中使用AVFoundation框架录制视频。视频录制完成后,我会使用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.tumb就不会被正确保存。

我使用了不同的方法。当用户点击"录制"时,我首先点击相机中的照片,然后开始录制视频。后来我用同一张照片作为缩略图。

我知道这不是最好的方法,但最好的是它能起作用;)

希望这能帮助到有同样问题的人。

最新更新