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];     

                                            }

                                            

                                        });

                                        

                                    }];

    }

    

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM