在上一篇文章:GPUImage的使用(圖片渲染篇) 中已經(jīng)介紹了如何接入GPUImage,并且實現(xiàn)了簡單的圖片渲染,在這片文章中我來介紹一下如何給已保存的視頻進行編輯。
給視頻渲染,最基本的需要聲明三個變量:GPUImageMovie(視頻載體),GPUImageOutput(濾鏡),GPUImageMovieWriter(寫入視頻文件類)。
@interface VideoEditViewController : UIViewController
{
//預覽用
GPUImageMovie *movieFile;
//保存用
GPUImageMovie *saveMovie;
//預覽用的濾鏡
GPUImageOutput<GPUImageInput> *filter;
//保存用的濾鏡
GPUImageOutput<GPUImageInput> *savefilter;
GPUImageMovieWriter *saveWrite;
}
因為GPUImageMovieWriter保存編輯視頻的時候是從預覽到的那一幀開始寫入的,所以我把預覽跟保存用的GPUImageMovie和GPUImageOutput分成兩個對象來操作,也就是說,預覽的時候用一個GPUImageMovie對象,保存的時候用另外一個新的GPUImageMovie對象
先看預覽的代碼:
//初始化GPUImageMovie
movieFile = [[GPUImageMovie alloc] initWithURL:self.pathURL];
//設置預覽重復播放
movieFile.shouldRepeat = YES;
movieFile.runBenchmark = YES;
//設置渲染速度與視屏播放速度一致
movieFile.playAtActualSpeed = YES;
//初始化磨皮濾鏡
filter = [[GPUImageBeautifyFilter alloc] init];
//原圖
filter = [[GPUImageBrightnessFilter alloc] init];
[(GPUImageBrightnessFilter *)filter setBrightness:0];
savefilter = [[GPUImageBrightnessFilter alloc] init];
[(GPUImageBrightnessFilter *)savefilter setBrightness:0];
//把濾鏡添加到GPUImageMovie中
[movieFile addTarget:filter];
// Only rotate the video for display, leave orientation the same for recording
//創(chuàng)建預覽的GPUImageView并顯示
filterView = [[GPUImageView alloc] init];
filterView.frame = CGRectMake(0, 64, ScreenWidth, ScreenWidth);
// filterView.transform = CGAffineTransformMakeRotation(90 * M_PI/180.0);
[self.view addSubview:filterView];
[self.view sendSubviewToBack:filterView];
//把濾鏡內(nèi)容顯示到預覽中
[filter addTarget:filterView];
//開始預覽
[movieFile startProcessing];
//重新創(chuàng)建GPUImageMovie用于保存
saveMovie = [[GPUImageMovie alloc] initWithURL:self.pathURL];
saveMovie.shouldRepeat = YES;
saveMovie.runBenchmark = YES;
saveMovie.playAtActualSpeed = YES;
[saveMovie addTarget:savefilter];
//保存路徑
NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"temp.mp4"];
unlink([path UTF8String]);
saveURL = [NSURL fileURLWithPath:path];
//清空路徑里的文件
[[NSFileManager defaultManager] removeItemAtURL:saveURL error:nil];
saveWrite = [[GPUImageMovieWriter alloc] initWithMovieURL:saveURL size:CGSizeMake(ScreenWidth, ScreenWidth) fileType:AVFileTypeMPEG4 outputSettings:nil];
[savefilter addTarget:saveWrite];
saveWrite.shouldPassthroughAudio = NO;
saveWrite.encodingLiveVideo = YES;
// saveMovie.audioEncodingTarget = saveWrite;
[saveMovie enableSynchronizedEncodingUsingMovieWriter:saveWrite];
[saveWrite startRecording];
[saveMovie startProcessing];
[MBProgressHUD showHUDAddedTo:self.view animated:YES].label.text = @"正在導出。。。";
__weak VideoEditViewController *weakSelf = self;
__weak GPUImageOutput<GPUImageInput> *weakSaveFilter = savefilter;
__weak GPUImageMovieWriter *weakmovieWriter = saveWrite;
__weak GPUImageMovie *weakSaveMovie = saveMovie;
__weak NSURL *weakSaveURL = saveURL;
[saveWrite setCompletionBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
[weakSaveFilter removeTarget:weakmovieWriter];
[weakmovieWriter finishRecording];
[weakSaveMovie endProcessing];
[weakSaveMovie cancelProcessing];
[weakSaveMovie removeTarget:weakSaveFilter];
[MBProgressHUD hideHUDForView:weakSelf.view animated:YES];
NSLog(@"保存成功");
});
}];
注意:
1:路徑問題
NSURL *saveURL = [NSURL fileURLWithPath:savePath];
創(chuàng)建URL要用fileURLWithPath不能用URLWithString,否則會報錯!
2:保存時報couldn't write a frame
[saveWrite startRecording];
方法一定要在
[saveMovie startProcessing];
方法后面,不然編輯有時候會編輯失敗