如何生成使用AVAssetImageGeneratorCompletionHandler块从已经录制的视频图像? [英] How to generate images from already recorded video using AVAssetImageGeneratorCompletionHandler block?
问题描述
因为我是一个新手到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屋!