很感谢你找到了本篇文章,因为与本篇博文相关的内容或许才是你寻找的关键。
首先呢,没错先把Libraray的链接共享给大家,完全是求点辛苦分,就请诸位别挖苦我啦,别人也需要我去用积分鼓励一下的嘛,况且你学的是其中的技术。
还有本人技术能力文档能力有限,如果有好的建议,尽管提出,共同提高的同时可以帮助更多的人。
在这里我要感谢阿超,没有他就没有GenerateFrameImageLibrary。
- GenerateFrameImage Libraray及sample下载地址
- sample演示及说明
- 制作sample
- library方法简介
1.GenerateFrameImage Libraray及sample下载地址
GenerateFrameImage Libraray:http://download.csdn.net/detail/knockheart/5543791
GenerateFrameImage Sample:http://download.csdn.net/detail/knockheart/5559815正在整合处理阶段目测有点大10.52M
2.sample演示及说明
sample真机模拟器都可以运行,5.1及以上
先截个图看看效果
看到图像不是正的,视频不是正的,只要图片翻转下就好,这里如果真的不会,我后续补上吧(现在才发现写博文是有所关联的)
左面个sample结构,右面是演示效果,演示用的.mov文件写死了,/supporting Files/sophie.mov(3秒多点),
Num ==>截取图片张数,
StarSec==>开始时间点(s)
endSec==>结束时间点(s)
上图中的label显示 0,即当前是第零张,程序员技术从零开始,习惯改不了啊,呵呵
previous 上一张,没有上一张提示
next 没错就是下一张,没有下一张提示
Doit 初始化视频,截图图片并显示第一张
3.制作sample
这里引用的是基于FFmpeg 自定义的GenerateFrameImage-Libraray(稍后添加链接地址),.mov视频截取指定时间内若干张图像
3.1新建一个Single View Appliction项目GenerateFrameImageDemo,devices选iPhone
3.2然后导入下载好的GenerateFrameImage-Library中的.a文件和.h头文件拷贝至项目文件夹
顺手的就将一个.mov视频文件,不是说项目不支持.mp4 和.avi,也是支持的只是mov更好一些
3.3将.h和视频添加至项目
本demo时长仅三秒多点
3.4点项目 BuildPhases->Link Binary With Libraies -> “+”
添加libGenerateFrameImage.a静态库
再添加 libbz2.dylib 、libiconv.dylib和 libz.dylib
3.5接下来我们来制作布局 这里简化掉了,本人认为大家都是有一定基础的哦,一张截图略过
3.6主要代码
ViewCnotroller.h
// // ViewController.h // GererateFrameImageDemo // // Created by EnCount on 13-6-8. // Copyright (c) 2013年 EnCount. All rights reserved. // #import <UIKit/UIKit.h> @interface ViewController : UIViewController { NSArray *imagesArray; int currentItem; } @property (retain, nonatomic) IBOutlet UILabel *currentNumLabel; @property (retain, nonatomic) IBOutlet UIImageView *imageView; @property (retain, nonatomic) IBOutlet UITextField *numTextField; @property (retain, nonatomic) IBOutlet UITextField *startSecTextField; @property (retain, nonatomic) IBOutlet UITextField *endSecTextField; - (IBAction)previousImage:(id)sender; - (IBAction)nextImage:(id)sender; - (IBAction)getImagesFromVideo:(id)sender; - (IBAction)endExitEdit:(id)sender; @end
ViewController.m
// // ViewController.m // GererateFrameImageDemo // // Created by EnCount on 13-6-8. // Copyright (c) 2013年 EnCount. All rights reserved. // #import "ViewController.h" #import "GenerateFrameImage.h" #import "Utilities.h" @interface ViewController () @end @implementation ViewController @synthesize currentNumLabel; @synthesize imageView; @synthesize numTextField; @synthesize startSecTextField; @synthesize endSecTextField; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)dealloc { [imageView release]; [numTextField release]; [startSecTextField release]; [endSecTextField release]; [currentNumLabel release]; [super dealloc]; } - (IBAction)previousImage:(id)sender { int imgSum = [imagesArray count]; if (imgSum != 0) { if (currentItem >=1) { currentItem--; currentNumLabel.text= [NSString stringWithFormat:@"%d",currentItem]; NSLog(@"CURRENTITEM == %d",currentItem); imageView.image = [UIImage imageWithData:[imagesArray objectAtIndex:currentItem]]; // video images are landscape, so rotate image view 90 degrees [imageView setTransform:CGAffineTransformMakeRotation(M_PI/2)]; }else{ UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Attention" message:@"This is the first image" delegate:nil cancelButtonTitle:@"I KNOW" otherButtonTitles:nil, nil]; [alert show]; [alert release]; } } } - (IBAction)nextImage:(id)sender { int imgSum = [imagesArray count]; if (imgSum != 0) { if (currentItem < (imgSum-1)) { currentItem++; currentNumLabel.text= [NSString stringWithFormat:@"%d",currentItem]; imageView.image = [UIImage imageWithData:[imagesArray objectAtIndex:currentItem]]; // video images are landscape, so rotate image view 90 degrees [imageView setTransform:CGAffineTransformMakeRotation(M_PI/2)]; }else{ UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Attention" message:@"This is the last image" delegate:nil cancelButtonTitle:@"I KNOW" otherButtonTitles:nil, nil]; [alert show]; [alert release]; } } } - (IBAction)getImagesFromVideo:(id)sender { double startTimer = [startSecTextField.text doubleValue]; double endTimer = [endSecTextField.text doubleValue]; int num = [numTextField.text intValue]; //init the video with Utilities path GenerateFrameImage * frameImage = [[GenerateFrameImage alloc]initWithFileUrl:[Utilities bundlePath:@"sophie.mov"]]; //double allTime=[frameImage duration]; imagesArray = [[NSMutableArray alloc]initWithArray:[frameImage getImages:num startSec:startTimer endSec:endTimer]]; if([imagesArray count] == 0){ UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Attention" message:@"Please input the 'Num',and Check StartSec or EndSec, can't be biger than duration of the video" delegate:nil cancelButtonTitle:@"I KNOW" otherButtonTitles:nil, nil]; [alert show]; }else{ imageView.image = [UIImage imageWithData:[imagesArray objectAtIndex:0]]; // video images are landscape, so rotate image view 90 degrees [imageView setTransform:CGAffineTransformMakeRotation(M_PI/2)]; currentItem= 0; } } - (IBAction)endExitEdit:(id)sender { [numTextField resignFirstResponder]; [startSecTextField resignFirstResponder]; [endSecTextField resignFirstResponder]; } @end
sample:(CSDN http://download.csdn.net/detail/knockheart/5546103)
4.Library方法简介
目前GenerateFrameImage-Library仅公开了getImages这么一个重要方法,如果有什么需要,我们可以进行升级
使用方法#import “GenerateFrameImage.h”~GenerateFrameImage *frameImage = [[GenerateFrameImage alloc] initWithFileUrl:url];NSArray *imageAry = [frameImage getImages:5 startSec:0 endSec:3];
父类
NSObject
方法一
- (id) initWithFileUrl;
参数
类型 NSString
frame图像的(.mov)格式视频的URL。
返回
GenerateFrameImage的实例
機能
Frame图像生成初始化操作
方法二
- (NSArray*) getImages:(int)frameNum startSec:(float) endSec:(float);
参数
1、取得图像数
2、取得图像的开始秒数
3、取得图像的结束秒数
※例:
[frameImage getImage:5 startSec:0.0 endSec:1.0];
取得1秒间5张图像。
返回值
NSArray数组 [NSData图像(.png 形式)]
不能取道图像是返回nil。
機能
取得指定视频特定时间段内的软干Frame图像的数组。
修正:根据一些网友的反应,说在iPhone5真机上不能运行的问题,我做了修改,界面适应iphone5,图像去除拉伸及旋转图像
只有横着的图像才需要旋转,一般不需要翻转
[imageView setTransform:CGAffineTransformMakeRotation(M_PI/2)];
请大家参考博文http://blog.csdn.net/knockheart/article/details/9071221
参考:http://blog.csdn.net/knockheart/article/details/9053671