现在的位置: 首页 > 综合 > 正文

[有图有真相]基于FFmpeg自定义Library,GenerateFrameImage的使用说明

2017年09月19日 ⁄ 综合 ⁄ 共 5917字 ⁄ 字号 评论关闭

很感谢你找到了本篇文章,因为与本篇博文相关的内容或许才是你寻找的关键。

首先呢,没错先把Libraray的链接共享给大家,完全是求点辛苦分,就请诸位别挖苦我啦,别人也需要我去用积分鼓励一下的嘛,况且你学的是其中的技术。

还有本人技术能力文档能力有限,如果有好的建议,尽管提出,共同提高的同时可以帮助更多的人。

在这里我要感谢阿超,没有他就没有GenerateFrameImageLibrary。

  1. GenerateFrameImage Libraray及sample下载地址
  2. sample演示及说明
  3. 制作sample
  4. 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


抱歉!评论已关闭.