这里介绍使用GPUImage为本地视频添加滤镜,下面会对GPUImage使用过程进行介绍并说明一些需要注意的东西:
工程中需要的文件可以到文章最后链接下载
首先把gpuimage.a和放置GPUImage头文件的文件夹usr添加到项目中
然后需要在info.plist文件中添加键值获取照片库访问权限:
NSPhotoLibraryUsageDescription
是否允许此App访问你的媒体资料库?
然后导入 AssetsLibrary框架
这里是获取了系统照片库第一个视频文件,所以运行的时候记得随便录制一个视频文件在系统照片库
获取GPUImage头文件的引用
import GPUImage.h
下面介绍主要使用到的内容
GPUImageMovie 接收需要添加滤镜的视频
GPUImageView 预览视频效果
GPUImageOutput 视频输入输出配置,这里承载滤镜
GPUImageMovieWriter 添加滤镜及输出视频
//
// ViewController.m
// VideoFilterText
//
//
#import "ViewController.h"
#import "GPUImage.h"
#import <AssetsLibrary/AssetsLibrary.h>
#define WIDTH [UIScreen mainScreen].bounds.size.width
#define HEIGHT [UIScreen mainScreen].bounds.size.height
#define WINDOW [[UIApplication sharedApplication] keyWindow]
@interface ViewController ()
@property (nonatomic,strong)GPUImageMovie * gpuMovie;//接管视频数据
@property (nonatomic,strong)GPUImageView * gpuView;//预览视频内容
@property (nonatomic,strong)GPUImageOutput<GPUImageInput> * pixellateFilter;//视频滤镜
@property (nonatomic,strong)GPUImageMovieWriter * movieWriter;//视频处理输出
@property (nonatomic,strong)UIScrollView * EditView;//滤镜选择视图
@property (nonatomic,strong)NSArray * GPUImgArr;//存放滤镜数组
@property (nonatomic,copy)NSURL * filePath;//照片库第一个视频路径
@property (nonatomic,copy)NSString * fileSavePath;//视频合成后存储路径
@property (nonatomic,strong)NSMutableDictionary * dic;//存放上个滤镜filter
@property (nonatomic,assign)NSTimer * timer;//设置计时器,因为重复合成同一个滤镜时间会很长超时后重新创建
@property (nonatomic,assign)int timeNum;//记时时间
@property (nonatomic,strong)UIView * hudView;//加载框
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
_dic = [[NSMutableDictionary alloc]initWithDictionary:@{@"filter":@""}];
[self getVideoUrl];//获取系统照片库第一个视频文件
// Do any additional setup after loading the view, typically from a nib.
}
-(void)getVideoUrl{
NSString *tipTextWhenNoPhotosAuthorization; // 提示语
// 获取当前应用对照片的访问授权状态
ALAuthorizationStatus authorizationStatus = [ALAssetsLibrary authorizationStatus];
// 如果没有获取访问授权,或者访问授权状态已经被明确禁止,则显示提示语,引导用户开启授权
if (authorizationStatus == ALAuthorizationStatusRestricted || authorizationStatus == ALAuthorizationStatusDenied) {
NSDictionary *mainInfoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appName = [mainInfoDictionary objectForKey:@"CFBundleDisplayName"];
tipTextWhenNoPhotosAuthorization = [NSString stringWithFormat:@"请在设备的\"设置-隐私-照片\"选项中,允许%@访问你的手机相册", appName];
// 展示提示语
}
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
[group setAssetsFilter:[ALAssetsFilter allVideos]];
if (group.numberOfAssets > 0) {
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
static int i = 1;
if (i == 1) {
i++;
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
[dateFormatter