聲明變量
@interface ********** { GPUImageVideoCamera *Camera; GPUImageOutput *Filters; GPUImageView *CameraShowView; }
首先是Camera,一種是GPUImageStillCamera,另一個種為GPUImageVideoCamera.正如其命名,如果只是拍照使用前者.錄制視頻使用后者.
//init, 第一個參數分辨率 第二個參數,前后攝像頭選擇 Camera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; Camera.outputImageOrientation = UIInterfaceOrientationPortrait; Camera.horizontallyMirrorFrontFacingCamera = NO; Camera.horizontallyMirrorRearFacingCamera = NO;
其次camera獲取視頻(圖片)后,加以濾鏡也就是filter, filter可以疊加,也可以自定義(比如美顏).
//黑白濾鏡 Filters = [GPUImageColorPackingFilter new]; //將將濾鏡加至攝像頭 [Camera addTarget:Filters];
最后輸出處理后的視頻或圖片,這里可以可以直接輸出至屏幕,也可以使用GPUImageMovieWriter,也就是錄制了.
//用於顯示視頻的GPUImageView CameraShowView = [[GPUImageView alloc] initWithFrame:CGRectMake(0, 64,self.view.frame.size.width,self.view.frame.size.width*1.25)]; [CameraShowView setInputRotation:kGPUImageFlipHorizonal atIndex:0]; CameraShowView.fillMode = kGPUImageFillModePreserveAspectRatioAndFill; [self.view addSubview:CameraShowView]; //將視頻輸出到->CameraShowView [Filters addTarget:CameraShowView];
當然也不要忘記啟動
//視頻啟動 [Camera startCameraCapture];
其他
//前后攝像頭切換 -(void)VideoPosition:(UIButton*)Button{ [Camera rotateCamera]; Button.selected = !Button.selected; } //閃關燈 -(void)LightBtn:(UIButton*)Btn{ if (Camera.inputCamera.position == AVCaptureDevicePositionBack) { if (Btn.selected) { [Camera.inputCamera lockForConfiguration:nil]; [Camera.inputCamera setTorchMode:AVCaptureTorchModeOff]; [Camera.inputCamera unlockForConfiguration]; }else{ [Camera.inputCamera lockForConfiguration:nil]; [Camera.inputCamera setTorchMode:AVCaptureTorchModeOn]; [Camera.inputCamera unlockForConfiguration]; } Btn.selected = !Btn.selected; }else{ NSLog(@"當前使用前置攝像頭,未能開啟閃光燈"); } }
多濾鏡疊加,
由於項目要求,視頻在錄制的時候,需要使用特殊的比例(1比1),而在GPUImageVideoCamera的默認配置里,並沒有這個比例.
所以考慮到錄制的過程中需要使用美顏的濾鏡,所以需使用GPUImageFilterGroup.以下就是添加了一個裁剪的濾鏡
//其實也就是filter替換成FilterGroup _filterGroup = [[GPUImageFilterGroup alloc] init]; //這里可以添加多個不同濾鏡 [self addGPUImageFilter:[[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 1.0,0.5625)]];
addGPUImageFilter
//添加濾鏡 - (void)addGPUImageFilter:(GPUImageOutput<GPUImageInput> *)filter { [_filterGroup addFilter:filter]; GPUImageOutput<GPUImageInput> *newTerminalFilter = filter; NSInteger count = _filterGroup.filterCount; if (count == 1) { _filterGroup.initialFilters = @[newTerminalFilter]; _filterGroup.terminalFilter = newTerminalFilter; } else { GPUImageOutput<GPUImageInput> *terminalFilter = _filterGroup.terminalFilter; NSArray *initialFilters = _filterGroup.initialFilters; [terminalFilter addTarget:newTerminalFilter]; _filterGroup.initialFilters = @[initialFilters[0]]; _filterGroup.terminalFilter = newTerminalFilter; } }