如何生成使用AVAssetImageGeneratorCompletionHandler块从已经录制的视频图像? [英] How to generate images from already recorded video using AVAssetImageGeneratorCompletionHandler block?

查看:915
本文介绍了如何生成使用AVAssetImageGeneratorCompletionHandler块从已经录制的视频图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因为我是一个新手到iPhone,这可能是为一个愚蠢的问题,但遗憾。

我要生成视频的每一帧图像,并显示在里面的UIScrollView的UIImageView。

当我试图这样做,我收到内存警告和我的应用程序崩溃。

下面是我的code。

   - (IBAction为)onCameraButton pressed:(ID)发送者
{
    //初始化的UIImagePickerController选择短片从相机胶卷。
    *的UIImagePickerController = videoPicker [的UIImagePickerController页头]初始化];
    videoPicker.delegate =自我;
    videoPicker.modal presentationStyle = UIModal presentationCurrentContext;
    videoPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    videoPicker.mediaTypes = @(* NSString的)kUTTypeMovie]
    [自presentViewController:videoPicker动画:是完成:无];
}的#pragma标记图像选取器控制器代表 - (无效)imagePickerController:(*的UIImagePickerController)选择器didFinishPickingMediaWithInfo:(NSDictionary的*)信息
{
   [个体经营dismissViewControllerAnimated:YES完成:无];
    currentVideoURL =信息[UIImagePickerControllerReferenceURL]
    //视频URL =资产库://asset/asset.MOV ID = D0A4A3EE-C5F3-49C8-9E45-ADF775B9FA8C和放大器; EXT = MOV
    //的NSLog(@视频URL =%@,currentVideoURL);
    // imageIndex指定= 0;
    对于(*的UIImageView在thumbnailScrollView.subviews子视图)
    {
        [子视图removeFromSuperview]
    }
    [个体经营generateThumbnailsFromVideoURL:currentVideoURL];
    // [自generateAVAssetThumbnails:currentVideoURL];
    // [自appleImageGenerator:currentVideoURL];
    } - (无效)generateThumbnailsFromVideoURL:(NSURL *)videoURL
{
    AVURLAsset *资产= [[AVURLAsset页头] initWithURL:videoURL选项:无];
    //的NSLog(@视频长度%LLD秒,asset.duration.value / asset.duration.timescale);
    INT videoDuration =(asset.duration.value / asset.duration.timescale);    如果(cmTimeArray.count大于0){
        [cmTimeArray removeAllObjects]
    }
    的for(int i = 0; I< videoDuration;我++)
    {
        tempInt的int64_t = I;
        CMTime tempCMTime = CMTimeMake(tempInt,1);
        int32_t间隔= 15;
        对于(INT J = 1; J< 16; J ++)
        {
            CMTime newCMtime = CMTimeMake(J,间隔);
            CMTime此外= CMTimeAdd(tempCMTime,newCMtime);
            [cmTimeArray ADDOBJECT:[NSValue valueWithCMTime:除了]];
        }
    }
    //的NSLog(@%时间@计数=%d个数组,cmTimeArray,cmTimeArray.count);
    / *为(INT T = 0; T< asset.duration.value;吨++){
        CMTime thumbTime = CMTimeMake(T,asset.duration.timescale);
        NSValue * V = [NSValue valueWithCMTime:thumbTime];
        [cmTimeArray ADDOBJECT:V];
    }
    的NSLog(@%时间@计数=%d个数组,cmTimeArray,cmTimeArray.count); * /
    __block INT I = 0;
    // __块的UIImage * currentImage =零;
    AVAssetImageGeneratorCompletionHandler处理器= ^(CMTime requestedTime,CGImageRef IM,CMTime actualTime,AVAssetImageGeneratorResult结果,NSError *错误){
        如果(结果== AVAssetImageGeneratorSucceeded){
            // currentImage = [UIImage的imageWithCGImage:IM]。
            // [framesArray ADDOBJECT:[UIImage的imageWithCGImage:即时]];
            [个体经营performSelectorOnMainThread:@selector(insertImageToScrollView :) withObject:[UIImage的imageWithCGImage:IM] waitUntilDone:NO];
        }
        其他
            的NSLog(@哎哟:%@,error.description);
        我++;
        = imageIndex指定我;
        如果(我== cmTimeArray.count){
            // [自performSelectorOnMainThread:@selector(insertImageToScrollView :) withObject:framesArray waitUntilDone:YES];
        }
    };    //启动过程中...
    self.generator = [[AVAssetImageGenerator页头​​] initWithAsset:资产];
    self.generator.applies preferredTrackTransform = TRUE;
    self.generator.requestedTimeToleranceBefore = kCMTimeZero;
    self.generator.requestedTimeToleranceAfter = kCMTimeZero;
    self.generator.maximumSize = CGSizeMake(40,40);
    [self.generator generateCGImagesAsynchronouslyForTimes:cmTimeArray completionHandler:处理程序];
    } - (无效)insertImageToScrollView:(*的UIImage)图像
{
    INT xPosition位置=(5 * imageIndex指定)+(宽* imageIndex指定)+ OFFSET;
    *的UIImageView = currentImageView [[UIImageView的页头] initWithFrame:方法CGRectMake(xPosition位置,5,宽,Width)];
    currentImageView.tag = + imageIndex指定10;
    currentImageView.image =图像;
    [thumbnailScrollView addSubview:currentImageView];
    [thumbnailScrollView setContentSize:CGSizeMake(xPosition位置+宽+ 5,thumbnailScrollView.frame.size.height)];
}


解决方案

我发现我错了。我在我的40 * 40的图像视图分配原/完整图像。这是产生记忆警告。为了解决提供所需的图像尺寸,同时采用以下code生成图像。

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

This might be a silly question but sorry for that as i am a newbie to iPhone.

I want to generate images for every frames of video and display that in UIScrollview inside UIImageView.

When i am trying to do that i am getting memory warning and my app crashes.

Below is my code.

- (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)];
}

解决方案

I found my mistake. I was assigning original/full image to my 40*40 image view. That was generating memory warning. To solve provide required image size while generating image using below code.

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

这篇关于如何生成使用AVAssetImageGeneratorCompletionHandler块从已经录制的视频图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆