天天看点

ios关于GPUImage图片拍摄及视频录制GPUImage图片拍摄及视频录制、给以后视频添加滤镜开始录制结束视频录制点击拍照拍照

@ios关于GPUImage图片拍摄及视频录制

GPUImage图片拍摄及视频录制、给以后视频添加滤镜

基本属性

  1. GPUImageVideoCamera 视频拍摄;
  2. GPUImageStillCamera 图片拍摄,其实继承于GPUImageVideoCamera,所以GPUImageStillCamera既可以拍照也可以拍视频;
  3. GPUImageFilter 默认滤镜效果
  4. GPUImageMovieWriter录制写入 ;
  5. GPUImageView取景框;

初始化摄像头

videoCamera = [[GPUImageStillCamera alloc]        initWithSessionPreset:AVCaptureSessionPresetPhoto    cameraPosition:AVCaptureDevicePositionFront];

videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

[videoCamera addAudioInputsAndOutputs];
videoCamera.horizontallyMirrorFrontFacingCamera = YES;
           

AVCaptureSessionPresetPhoto 拍照使用,取景跟自带相机相同

下面为其他参数(不一一列举,根据需要选择)

AVCaptureSessionPresetHigh

AVCaptureSessionPresetMedium

AVCaptureSessionPresetLow

AVCaptureSessionPreset1280x720

摄像头位置:前后

AVCaptureDevicePositionFront

AVCaptureDevicePositionBack

输出方向

outputImageOrientation

UIDeviceOrientationPortraitUpsideDown

UIDeviceOrientationLandscapeRight

UIDeviceOrientationLandscapeLeft

加入原声

addAudioInputsAndOutputs

镜像 如果使用前置摄像头会出现反向效果,通过此值可进行设置,

videoCamera.horizontallyMirrorFrontFacingCamera = YES;

一般默认开始为前置摄像头时用以上方法处理,如果默认后置摄像头,用以下方法处理

if (imageCamera.cameraPosition == AVCaptureDevicePositionFront)

[filteredVideoView setInputRotation:kGPUImageFlipHorizonal atIndex:0];

[filteredVideoView setInputRotation:kGPUImageNoRotation atIndex:0];

取景框显示模式

filteredVideoView.fillMode = kGPUImageFillModePreserveAspectRatio;

kGPUImageFillModeStretch //拉伸以填充,会变形

kGPUImageFillModePreserveAspectRatio //维护源图像的长宽比,添加指定背景颜色的条

kGPUImageFillModePreserveAspectRatioAndFill //保持源图像的长宽比,放大它的中心以填充视图

添加滤镜 简单添加滤镜(滤镜效果120多种,可自行搜索使用)

GPUImageBeautifyFilter *filterGroup = [[GPUImageBeautifyFilter alloc]init];

[videoCamera addTarget:filterGroup];

GPUImageBeautifyFilter 为一个美颜磨皮类非GPUImage自带,可自行搜索下载

如果对此效果不满意可使用以下几种滤镜自行设置参数

// 饱和

GPUImageSaturationFilter *saturationFilter;

// 磨皮

GPUImageBilateralFilter *bilateralFilter;

// 美白

GPUImageBrightnessFilter *brightnessFilter;

// 曝光

GPUImageExposureFilter *exposureFilter;

组合滤镜

- (GPUImageFilterGroup *) getGroupFilters {

//创建滤镜组

GPUImageFilterGroup *filterGroup = [[GPUImageFilterGroup alloc]init];

//创建滤镜(设置滤镜的引来关系)

[bilateralFilter addTarget:brightnessFilter];

[brightnessFilter addTarget:exposureFilter];

[exposureFilter addTarget:saturationFilter];

//设置滤镜起点 终点的filter

filterGroup.initialFilters = @[bilateralFilter];

filterGroup.terminalFilter = saturationFilter;

return filterGroup;

}

拍照、录制视频

开始录制

movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(filteredVideoView.sizeInPixels.width, filteredVideoView.sizeInPixels.height)];
 [videoFilter addTarget:movieWriter];
videoCamera.audioEncodingTarget = movieWriter;
[movieWriter startRecording];
           

结束视频录制

[movieWriter finishRecording];
[videoFilter removeTarget:movieWriter];
#结束拍照
[videoFilter useNextFrameForImageCapture];
//获取当前数据流的图像,
UIImage *processedImage = [videoFilter imageFromCurrentFramebuffer];
// processedImage 为获取图片
           

点击拍照拍照

[imageCamera capturePhotoAsImageProcessedUpToFilter:imagefilter withCompletionHandler:^(UIImage *processedImage, NSError *error) {
    if(error){
        return;
    }
      processedImage 为拍摄图片
}];
           

图片添加滤镜效果

- (UIImage *)imageByFilteringImage:(UIImage *)inImage {
 CGImageRef inImageRef = [inImage CGImage];
GLuint w = CGImageGetWidth(inImageRef);
GLuint h = CGImageGetHeight(inImageRef);
// 设置要添加滤镜的图片
if(inImage == nil){
    inImage = [UIImage imageNamed:@"1"];
}

// 初始化要添加滤镜的图片

GPUImagePicture *imageSorce = [[GPUImagePicture alloc] initWithImage:inImage]; IFImageFilter *filter = [[IFImageFilter alloc] init];
// 设置输出的图片的尺寸
[imageFilter forceProcessingAtSize:CGSizeMake(w, h)];
// 添加滤镜
[imageSorce addTarget:imageFilter];
[imageFilter useNextFrameForImageCapture];
[imageSorce processImage];
return [imageFilter imageFromCurrentFramebuffer];  }
           

视频添加滤镜预览效果(预览效果没有声音)可提取声音源进行同步播放

self.movieFile = [[GPUImageMovie alloc] initWithURL:[dict objectForKey:@"url"]];
self.movieFile.playAtActualSpeed = NO;//是否原速播放
self.movieFile.shouldRepeat = NO;//是否循环播放
GPUImageOutput<GPUImageInput> *pixellateFilter = [[AlbumFilterManager shareManager] filterType:[[dict objectForKey:@"index"]intValue]];//滤镜效果,此处作者进行了封装,跟胡index取的路径效果
[self.movieFile addTarget:pixellateFilter];
[pixellateFilter addTarget:self];
//开始播放
[self.movieFile startProcessing];
           

视频添加滤镜合成

//添加视频存储路径
    NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@.mp4",[NSString uuid]]];
    unlink([pathToMovie UTF8String]);
    self.pathToMovie = pathToMovie;
    NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
    //视频url用于获取宽高
    NSURL *videoUrl1 = [dict objectForKey:@"url"];
    AVURLAsset * asss = [AVURLAsset URLAssetWithURL:videoUrl1 options:nil];
    CGSize videoSize2 = asss.naturalSize;
    NSLog(@"%f    %f",videoSize2.width,videoSize2.height);
    _saveMovieFile = [[GPUImageMovie alloc] initWithURL:videoUrl1];
    //播放速度
    _saveMovieFile.playAtActualSpeed = YES;
    GPUImageOutput<GPUImageInput> * Filter = [[AlbumFilterManager shareManager] filterType:self.filterIndx.row];
    [_saveMovieFile addTarget:Filter];
    _movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:videoSize2];
    NSLog(@"------movieURL is ----%@",movieURL);
    //滤镜添加
    [Filter addTarget:_movieWriter];
    //是否使用源音源
    _movieWriter.shouldPassthroughAudio = YES;
    //加入声音
    AVAsset *anAsset = [AVAsset assetWithURL:videoUrl1];
    //此处视频如果没有声音源则不加入
    if ([[anAsset tracksWithMediaType:AVMediaTypeAudio] count] > 0){
        _saveMovieFile.audioEncodingTarget = _movieWriter;
    } else {//no audio
        _saveMovieFile.audioEncodingTarget = nil;
    }
    [_saveMovieFile enableSynchronizedEncodingUsingMovieWriter:_movieWriter];
    //开始处理
    [_movieWriter startRecording];
    //视频从头播放
    [_saveMovieFile startProcessing];
    __weak MPPublicDynamicController * weakSelf = self;
    __weak GPUImageMovieWriter * weakmovieWriter = self.movieWriter;
    [_movieWriter setCompletionBlock:^{
            [Filter removeTarget:weakmovieWriter];
            [weakmovieWriter finishRecording];
         NSLog(@"视频合成结束-成功");
    }];
   [_movieWriter setFailureBlock:^(NSError *error) {
        NSLog(@"视频合成结束-失败");
            [Filter removeTarget:weakmovieWriter];
            [weakmovieWriter finishRecording];
        NSLog(@"合成失败 173:error = %@",error.description);
    }];
           

此文本仅为个人记录,参考其他作者发布内容整合,有些可能解释的不是很透彻,如有任何问题请提出,如有侵权内容,请联系删除