短视频从无到有 (七)视频添加滤镜
2018-07-24 本文已影响7人
卢叁
有了GPUImage,我们可以十分方便的给视频添加滤镜。例如,我们可以在播放时实时的给视频添加滤镜,以观察效果。代码如下:
//播放视频
AVPlayerItem *item =[[AVPlayerItem alloc]initWithURL:_videoURL];
AVPlayer *player =[[AVPlayer alloc]initWithPlayerItem:item];
AVPlayerLayer *playerLayer =[AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame =self.view.bounds;
[self.view.layer addSublayer:playerLayer];
movieFile =[[GPUImageMovie alloc]initWithPlayerItem:item];
movieFile.runBenchmark =YES;
movieFile.playAtActualSpeed =YES;
filter =[[GPUImageSketchFilter alloc] init];
[movieFile addTarget:filter];
filterView =[[GPUImageView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:filterView];
[filter addTarget:filterView];
[player play];
[movieFile startProcessing];
而把添加滤镜后的视频保存到本地的话 ,则需要GPUImage框架中的GPUImageMovieWriter这个类写到本地即可,还是贴代码:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// [movieFile removeAllTargets];
// //新的滤镜
// filter =[[GPUImageSepiaFilter alloc]init];
//
// [movieFile addTarget:filter];
// [filter addTarget:filterView];
//movieWriter 写到本地
endMovieFile =[[GPUImageMovie alloc]initWithURL:_videoURL];
endMovieFile.runBenchmark =YES;
endMovieFile.playAtActualSpeed =YES;
endFilter =[[GPUImageSepiaFilter alloc]init];
[endMovieFile addTarget:endFilter];
NSString *pathToMovie =[self getVideoSaveFilePathString:@".MOV" addPathArray:NO];
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter =[[GPUImageMovieWriter alloc]initWithMovieURL:movieURL size:CGSizeMake(720, 1280)];
[endFilter addTarget:movieWriter];
movieWriter.shouldPassthroughAudio =YES;
endMovieFile.audioEncodingTarget =movieWriter;
[endMovieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
[movieWriter startRecording];
[endMovieFile startProcessing];
[movieWriter setCompletionBlock:^{
WeakSelf(self);
dispatch_async(dispatch_get_main_queue(), ^{
[self.hud hideAnimated:YES];
[endFilter removeTarget:movieWriter];
[movieWriter finishRecording];
//保存相册
[self savePhotosAlbum:movieURL];
});
}];
});
注:3秒后保存到本地相当于按钮事件,示例而已。movieWriter相当于把视频重写一遍,完成回调后要移除target,还要结束录制。
有什么问题欢迎留言讨论。