zoukankan      html  css  js  c++  java
  • GPUImage 视频录制加滤镜

    /// 创建相机和滤镜

    - (void)createVideoCamera:(AVCaptureDevicePosition)frontOrBack{

        [videoCamera removeAllTargets];

        videoCamera = nil;

        videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:frontOrBack];

        videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

     /// horizontallyMirrorFrontFacingCamera 属性 YES 代表前置的时候不是镜像

        videoCamera.horizontallyMirrorFrontFacingCamera = YES;

        videoCamera.horizontallyMirrorRearFacingCamera = NO;

      /// 裁剪滤镜

        cropFilter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0, (1280-720)/2/1280.0, 1,720/1280.0)];

      /// 自定义的美颜滤镜

        beautyFilter = [[GPUImageBeautyFilter alloc] init];

      /// 滤镜分组 

        filterGroup = [[GPUImageFilterGroup alloc] init];

      /// 没有开美颜

        if (!isBeauty) {

            [videoCamera addTarget:cropFilter];

      /// 预览层 /*预览层可以省略*/

            [cropFilter addTarget:preView];

        }

        else{/// 美颜和裁剪滤镜都加到滤镜组里

            [cropFilter addTarget:beautyFilter];

            [filterGroup addTarget:cropFilter];

            [filterGroup addTarget:beautyFilter];

            [filterGroup setInitialFilters:[NSArray arrayWithObject:cropFilter]];

            [filterGroup setTerminalFilter:beautyFilter];

            [filterGroup forceProcessingAtSize:preView.frame.size];

            [filterGroup useNextFrameForImageCapture];

            [videoCamera addTarget:filterGroup];

            [filterGroup addTarget:preView];

        }

      /// 开始捕捉

        [videoCamera startCameraCapture];

    }

    ///开始录制  分段录制每次都要实例化一个movieWriter

    - (void)startPhoto {

      /// 根据时间生成路径 录制的视频会存储到该路径下 要唯一

        NSString *pathToMovie = [self getVideoMergeFilePathString];

        [videoArray addObject:pathToMovie];

        NSLog(@"%@",pathToMovie);

        unlink([pathToMovie UTF8String]);

        NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

    //    movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720, 720) fileType:AVFileTypeQuickTimeMovie outputSettings:videoSettings];

        movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(720, 720)];

      /// audioSettings 一些音频配置

     /*

    AudioChannelLayout channelLayout;

        memset(&channelLayout, 0, sizeof(AudioChannelLayout));

        channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;

        audioSettings = [NSDictionary dictionaryWithObjectsAndKeys:

                         [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,//制定编码算法

                         [ NSNumber numberWithInt: 2 ], AVNumberOfChannelsKey,//声道

                         [ NSNumber numberWithFloat: 16000.0 ], AVSampleRateKey,//采样率

                         [ NSData dataWithBytes:&channelLayout length: sizeof( AudioChannelLayout ) ], AVChannelLayoutKey,

                         [ NSNumber numberWithInt: 32000 ], AVEncoderBitRateKey,//编码率

                         nil];

    */

        [movieWriter setHasAudioTrack:YES audioSettings:audioSettings];

        movieWriter.hasAudioTrack = YES;

        [videoCamera addAudioInputsAndOutputs];

        videoCamera.audioEncodingTarget = movieWriter;

        if (!isBeauty) {

            [cropFilter addTarget:movieWriter];

        }

        else {

            [filterGroup addTarget:movieWriter];

        }

        [movieWriter startRecording];

    }

    ///完成录制

    - (void)endRecording {

        [movieWriter finishRecording];

        [cropFilter removeTarget:movieWriter];

        [beautyFilter removeTarget:movieWriter];

        [filterGroup removeTarget:movieWriter];

        videoCamera.audioEncodingTarget = nil;

    //    [self savePhotoCmare:videoArray.lastObject];

    }

    ///把录制好的视频写相册

    - (void)savePhotoCmare:(NSString *)pathToMovie {

        NSURL *url = [[NSURL alloc] initFileURLWithPath:pathToMovie];

        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

        

        

        if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:url]) {

            [library writeVideoAtPathToSavedPhotosAlbum:url

                                        completionBlock:^(NSURL *assetURL, NSError *error){

                                            dispatch_async(dispatch_get_main_queue(), ^{

                                                if (error) {

                                                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Video Saving Failed"  delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil, nil];

                                                    [alert show];

                                                }else{

                                                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Video Saved" message:@"Saved To Photo Album"  delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];

                                                    [alert show];     

                                                }

                                                

                                            });

                                            

                                        }];

        }

        

    }

  • 相关阅读:
    校园网认证原理
    使VS Code自带的Markdown支持mathjax
    图像处理实用资源
    第一周的python作业
    Python中关于turtle库的笔记
    软件测试入门篇
    如何设计一条好的测试用例打卡第二天
    根据用户登录浅谈软件测试打卡第一天
    Andorid源码系列:View的onTouchEvent()与performClick(),performLongClick()调用时机解析
    论Activity及启动模式,Fragment,Service的使用以及生命周期
  • 原文地址:https://www.cnblogs.com/xia0huihui/p/5430737.html
Copyright © 2011-2022 走看看