- 之前时候录屏的方法帧率的问题,行不通
- 把控件放在view 里生成图片放在GPUImageUIElement 水印上,这样可以把view的画面生成视频流(0.1s 生成一张图片)
-(void)setup{
// 初始化GPUImage的相机功能,同时设置高清画设置,以及使用前置摄像头
self.camera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetiFrame1280x720 cameraPosition:AVCaptureDevicePositionBack];
// 设置镜头的方向,这里设的正常竖立的
self.camera.outputImageOrientation = UIInterfaceOrientationPortrait;
// 这两句是使用系统相机的设置,如何是否镜像之类
self.camera.horizontallyMirrorRearFacingCamera = NO;
self.camera.horizontallyMirrorFrontFacingCamera = NO;
// 该句可防止允许声音通过的情况下,避免录制第一帧黑屏闪屏(====)
[self.camera addAudioInputsAndOutputs];
filter = [[GPUImageSepiaFilter alloc] init];
[(GPUImageSepiaFilter *)filter setIntensity:0];
// 创建摄像头预览视图,也可以在XiB拖个UIView,继承GPUImageView,也可以
self.cameraScreen = [[GPUImageView alloc] initWithFrame:self.view.frame];
// 添加到父视图上去
[self.view addSubview:self.cameraScreen];
_brightFilter = [[GPUImageBrightnessFilter alloc] init];
_brightFilter.brightness =0.0f;
_blendFliter = [[GPUImageAlphaBlendFilter alloc] init];
_blendFliter.mix = 1.0;
_uiElement = [[GPUImageUIElement alloc] initWithView:_preImgView2];
[filter useNextFrameForImageCapture];
[_brightFilter useNextFrameForImageCapture];
[_blendFliter useNextFrameForImageCapture];
[_uiElement useNextFrameForImageCapture];
__weaktypeof(self) weakSelf =self;
[_brightFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime Time) {
[weakSelf.uiElementupdate];
}];
[self.camera addTarget:filter];
[filter addTarget:_brightFilter];
[_brightFilter addTarget:_blendFliter];
[_uiElement addTarget:_blendFliter];
[_blendFliter addTarget:self.cameraScreen];
// 相机开始预览啦
[self.camera startCameraCapture];
NSString*timeStr = @"123333";//
// NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSFileManager * manager = [NSFileManager defaultManager];
//VIDEOPath 储存视频沙盒地址
if(![managerfileExistsAtPath:VIDEOPath]) {
[managercreateDirectoryAtPath:VIDEOPath withIntermediateDirectories:YES attributes:nil error:NULL];
}
_videoName=[NSStringstringWithFormat:@"%@.mp4",timeStr];
_videoPath = [VIDEOPath stringByAppendingPathComponent:_videoName];
// 初始化这个地址,不能UrlWithString的方法
NSURL*willSaveURL = [NSURLfileURLWithPath:_videoPath];
// 初始化视频制作操作,传入视频保存的url,以及显示范围的大小
self.movieWriter= [[GPUImageMovieWriteralloc]initWithMovieURL:willSaveURLsize:CGSizeMake(720,1280)];
// 自动控制声音与图像一致
self.movieWriter.encodingLiveVideo = YES;
self.movieWriter.shouldPassthroughAudio = YES;
self.movieWriter.hasAudioTrack = YES;
// 把这个视频的操作放进相机里面
self.camera.audioEncodingTarget = self.movieWriter;
}
#pragma mark 生成image
- (UIImage*)makeImageWithView:(UIView*)view
{
CGFloatscale = [[UIScreenmainScreen]scale];
UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, scale);
CGContextRef context =UIGraphicsGetCurrentContext();
[view.layerrenderInContext:context];
UIImage *targetImage =UIGraphicsGetImageFromCurrentImageContext();
// targetImage = [targetImage rotate:UIImageOrientationLeft];
UIGraphicsEndImageContext();
return targetImage;
}
/** 开始录制 */
- (void)Start
{
[_blendFliter addTarget:self.movieWriter];
[self.movieWriter startRecordingInOrientation:CGAffineTransformMakeRotation((angle2Rad(-90)))];
}
/** 停止录制 */
- (void)Close
{
_backView.hidden=NO;
// 美颜效果里移除掉录制操作
[filter removeTarget:self.movieWriter];
[_blendFliter removeTarget:self.movieWriter];
// 移除相机里的录制
self.camera.audioEncodingTarget = nil;
// 录制操作设为完成
[self.movieWriter finishRecording];
}
// 视频保存完毕回调
- (void)video:(NSString*)videoPath didFinishSavingWithError:(NSError*)error contextInfo: (void*)contextInfo
{
NSLog(@"视频保存的地址:%@",videoPath);
}