2013-04-18 1 views
0

이것은 어리석은 질문 일지 모르지만 나는 아이폰을 초보자로 생각해서 유감스럽게 생각합니다.AVAssetImageGeneratorCompletionHandler 블록을 사용하여 이미 녹화 된 비디오에서 이미지를 생성하는 방법은 무엇입니까?

비디오의 모든 프레임에 대한 이미지를 생성하고이를 UIImageView 내부의 UIScrollview에 표시하려고합니다.

내가 그 일을하려고 할 때 메모리 경고가 발생하고 응용 프로그램이 다운됩니다.

아래 코드는 제 코드입니다.

- (IBAction)onCameraButtonPressed:(id)sender 
{ 
    // Initialize UIImagePickerController to select a movie from the camera roll. 
    UIImagePickerController *videoPicker = [[UIImagePickerController alloc] init]; 
    videoPicker.delegate = self; 
    videoPicker.modalPresentationStyle = UIModalPresentationCurrentContext; 
    videoPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
    videoPicker.mediaTypes = @[(NSString*)kUTTypeMovie]; 
    [self presentViewController:videoPicker animated:YES completion:nil]; 
} 

#pragma mark Image Picker Controller Delegate 

- (void)imagePickerController:(UIImagePickerController *)picker  didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
    currentVideoURL = info[UIImagePickerControllerReferenceURL]; 
    //Video URL = assets-library://asset/asset.MOV?id=D0A4A3EE-C5F3-49C8-9E45-ADF775B9FA8C&ext=MOV 
    //NSLog(@"Video URL = %@",currentVideoURL); 
    //imageIndex = 0; 
    for (UIImageView *subView in thumbnailScrollView.subviews) 
    { 
     [subView removeFromSuperview]; 
    } 
    [self generateThumbnailsFromVideoURL:currentVideoURL]; 
    //[self generateAVAssetThumbnails:currentVideoURL]; 
    //[self appleImageGenerator:currentVideoURL]; 
    } 

- (void)generateThumbnailsFromVideoURL:(NSURL *)videoURL 
{ 
    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:videoURL options:nil]; 
    //NSLog(@"Video duration %lld seconds",asset.duration.value/asset.duration.timescale); 
    int videoDuration = (asset.duration.value/asset.duration.timescale); 

    if (cmTimeArray.count>0) { 
     [cmTimeArray removeAllObjects]; 
    } 
    for (int i = 0; i<videoDuration; i++) 
    { 
     int64_t tempInt = i; 
     CMTime tempCMTime = CMTimeMake(tempInt,1); 
     int32_t interval = 15; 
     for (int j = 1; j<16; j++) 
     { 
      CMTime newCMtime = CMTimeMake(j,interval); 
      CMTime addition = CMTimeAdd(tempCMTime, newCMtime); 
      [cmTimeArray addObject:[NSValue valueWithCMTime:addition]]; 
     } 
    } 
    //NSLog(@"Array of time %@ count = %d",cmTimeArray, cmTimeArray.count); 
    /*for(int t=0;t < asset.duration.value;t++) { 
     CMTime thumbTime = CMTimeMake(t,asset.duration.timescale); 
     NSValue *v=[NSValue valueWithCMTime:thumbTime]; 
     [cmTimeArray addObject:v]; 
    } 
    NSLog(@"Array of time %@ count = %d",cmTimeArray, cmTimeArray.count);*/ 
    __block int i = 0; 
    //__block UIImage *currentImage = nil; 
    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ 
     if (result == AVAssetImageGeneratorSucceeded) { 
      // currentImage = [UIImage imageWithCGImage:im]; 
      //[framesArray addObject:[UIImage imageWithCGImage:im]]; 
      [self performSelectorOnMainThread:@selector(insertImageToScrollView:) withObject:[UIImage imageWithCGImage:im] waitUntilDone:NO]; 
     } 
     else 
      NSLog(@"Ouch: %@", error.description); 
     i++; 
     imageIndex = i; 
     if(i == cmTimeArray.count) { 
      //[self performSelectorOnMainThread:@selector(insertImageToScrollView:) withObject:framesArray waitUntilDone:YES]; 
     } 
    }; 

    // Launching the process... 
    self.generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    self.generator.appliesPreferredTrackTransform=TRUE; 
    self.generator.requestedTimeToleranceBefore = kCMTimeZero; 
    self.generator.requestedTimeToleranceAfter = kCMTimeZero; 
    self.generator.maximumSize = CGSizeMake(40, 40); 
    [self.generator generateCGImagesAsynchronouslyForTimes:cmTimeArray completionHandler:handler]; 
    } 

-(void)insertImageToScrollView:(UIImage *)image 
{ 
    int xPosition = (5*imageIndex)+(WIDTH*imageIndex)+OFFSET; 
    UIImageView *currentImageView = [[UIImageView alloc]initWithFrame:CGRectMake(xPosition, 5, WIDTH, WIDTH)]; 
    currentImageView.tag = imageIndex+10; 
    currentImageView.image = image; 
    [thumbnailScrollView addSubview:currentImageView]; 
    [thumbnailScrollView setContentSize:CGSizeMake(xPosition+WIDTH+5,thumbnailScrollView.frame.size.height)]; 
} 

답변

1

내 실수를 발견했습니다. 내 40 * 40 이미지보기에 원래/전체 이미지를 할당하고있었습니다. 그것은 메모리 경고를 발생시키는 것입니다. 해결하려면 아래 코드를 사용하여 이미지를 생성하는 동안 필요한 이미지 크기를 제공하십시오.

self.generator.maximumSize = CGSizeMake(40, 40); 
3

모든 이미지를보기에로드하고 있지만 주어진 시간에 몇 개만 표시됩니다. 이미지의 양에 따라 많은 메모리가 필요할 수 있습니다.

모든 이미지를 생성하고 로컬 스토리지에 기록, 배열에 이미지의 파일 URL을 저장 :

는 다음과 같은 방법을 고려할 수 있습니다.

이제 스크롤보기의 경우 다음 이미지로 스크롤 할 때 필요한 경우에만 이미지를 추가하십시오. 이미지를 추가 할 때 이미지를 디스크에서로드하여보기에 추가합니다. 수평 무한 스크롤 뷰에 대한 예제 코드를 보자 : https://code.google.com/p/iphone-infinite-horizontal-scroller.

사용자 지정 셀이있는 일반 UITableView를 사용하여 이미지 만 표시 할 수도 있습니다.

+0

예, scrollview를 사용하는 것은 좋지 않습니다. 그래서 여기에 tableview를 사용하려고합니다. 답장을 보내 주셔서 감사합니다. –

관련 문제