iOS自定义相机实现拍照、录制视频
本文实例为大家分享了iOS自定义相机实现拍照、录制视频的具体代码,供大家参考,具体内容如下
使用AVFoundation框架。
这里是Demo
首先声明以下对象:
#import"CustomeCameraViewController.h" #import#import @interfaceCustomeCameraViewController() { //AVCaptureSession对象来执行输入设备和输出设备之间的数据传递 AVCaptureSession*iSession; //当前设备 AVCaptureDevice*iDevice; //输入设备 AVCaptureDeviceInput*iDeviceInput; //照片输出流 AVCaptureStillImageOutput*iStillImageOutput; //预览图层 AVCaptureVideoPreviewLayer*iPreviewLayer; }
初始化各对象:
-(void)viewDidLoad{ [superviewDidLoad]; //点击屏幕对焦 UITapGestureRecognizer*tap=[[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(focusTap:)]; [self.viewaddGestureRecognizer:tap]; iSession=[[AVCaptureSessionalloc]init]; NSArray*deviceArray=[AVCaptureDevicedevicesWithMediaType:AVMediaTypeVideo]; for(AVCaptureDevice*deviceindeviceArray){ //AVCaptureDevicePositionBack后置摄像头 //AVCaptureDevicePositionFront前置摄像头 if(device.position==AVCaptureDevicePositionBack){ iDevice=device; } } iSession.sessionPreset=[selfgetSessionPresetForDevice:iDevice]; iDeviceInput=[[AVCaptureDeviceInputalloc]initWithDevice:iDeviceerror:nil]; ////输出设置。AVVideoCodecJPEG输出jpeg格式图片 iStillImageOutput=[[AVCaptureStillImageOutputalloc]init]; NSDictionary*outputDic=[NSDictionarydictionaryWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil]; [iStillImageOutputsetOutputSettings:outputDic]; //更改这个设备设置的时候必须先锁定设备,修改完后再解锁,否则崩溃 [iDevicelockForConfiguration:nil]; if([iDeviceisFlashModeSupported:AVCaptureFlashModeOff]){ [iDevicesetFlashMode:AVCaptureFlashModeOff]; } if([iDeviceisFocusModeSupported:AVCaptureFocusModeAutoFocus]){ [iDevicesetFocusMode:AVCaptureFocusModeAutoFocus]; } if([iDeviceisWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeAutoWhiteBalance]){ [iDevicesetWhiteBalanceMode:AVCaptureWhiteBalanceModeAutoWhiteBalance]; } [iDeviceunlockForConfiguration]; if([iSessioncanAddInput:iDeviceInput]){ [iSessionaddInput:iDeviceInput]; } if([iSessioncanAddOutput:iStillImageOutput]){ [iSessionaddOutput:iStillImageOutput]; } if([iSessioncanAddOutput:iVideoOutput]){ [iSessionaddOutput:iVideoOutput]; } //初始化预览图层 iPreviewLayer=[[AVCaptureVideoPreviewLayeralloc]initWithSession:iSession]; [iPreviewLayersetVideoGravity:AVLayerVideoGravityResizeAspectFill]; iPreviewLayer.frame=CGRectMake(0,60,[UIScreenmainScreen].bounds.size.width,[UIScreenmainScreen].bounds.size.height-160); [self.iCameraView.layeraddSublayer:iPreviewLayer]; [iSessionstartRunning]; }
点击按钮拍照:
//拍照 -(void)takePictures{ AVCaptureConnection*connection=[iStillImageOutputconnectionWithMediaType:AVMediaTypeVideo]; if(!connection){ NSLog(@"失败"); return; } //设置焦距 [connectionsetVideoScaleAndCropFactor:1]; [iStillImageOutputcaptureStillImageAsynchronouslyFromConnection:connectioncompletionHandler:^(CMSampleBufferRefimageDataSampleBuffer,NSError*error){ if(imageDataSampleBuffer==NULL){ NSLog(@"NUll"); return; } NSData*data=[AVCaptureStillImageOutputjpegStillImageNSDataRepresentation:imageDataSampleBuffer]; UIImage*image=[UIImageimageWithData:data]; }]; }
image即为拍照所得图片:
设置session的AVCaptureSessionPreset属性
-(NSString*)getSessionPresetForDevice:(AVCaptureDevice*)device{ if([devicesupportsAVCaptureSessionPreset:AVCaptureSessionPreset3840x2160]){ returnAVCaptureSessionPreset3840x2160; }elseif([devicesupportsAVCaptureSessionPreset:AVCaptureSessionPreset1920x1080]){ returnAVCaptureSessionPreset1920x1080; }elseif([devicesupportsAVCaptureSessionPreset:AVCaptureSessionPreset1280x720]){ returnAVCaptureSessionPreset1280x720; }elseif([devicesupportsAVCaptureSessionPreset:AVCaptureSessionPreset640x480]){ returnAVCaptureSessionPreset640x480; }elseif([devicesupportsAVCaptureSessionPreset:AVCaptureSessionPreset352x288]){ returnAVCaptureSessionPreset352x288; }elseif([devicesupportsAVCaptureSessionPreset:AVCaptureSessionPresetHigh]){ returnAVCaptureSessionPresetHigh; }elseif([devicesupportsAVCaptureSessionPreset:AVCaptureSessionPresetMedium]){ returnAVCaptureSessionPresetMedium; }else{ returnAVCaptureSessionPresetLow; } }
设置闪光灯:
-(IBAction)iFlashBtn:(id)sender{ [iDevicelockForConfiguration:nil]; if(iDevice.flashMode==AVCaptureFlashModeOff){ if([iDeviceisFlashModeSupported:AVCaptureFlashModeOn]){ [iDevicesetFlashMode:AVCaptureFlashModeOn]; [self.iFlashBtnsetBackgroundImage:[UIImageimageNamed:@"flashBtn"]forState:UIControlStateNormal]; } }elseif(iDevice.flashMode==AVCaptureFlashModeOn){ if([iDeviceisFlashModeSupported:AVCaptureFlashModeOff]){ [iDevicesetFlashMode:AVCaptureFlashModeOff]; [self.iFlashBtnsetBackgroundImage:[UIImageimageNamed:@"flashOffBtn"]forState:UIControlStateNormal]; } } [iDeviceunlockForConfiguration]; }
切换前置摄像头与后置摄像头:
-(IBAction)iChangeBtn:(id)sender{ NSArray*array=[AVCaptureDevicedevicesWithMediaType:AVMediaTypeVideo]; AVCaptureDevice*newDevice=nil; AVCaptureDeviceInput*newDeviceInput=nil; CATransition*animation=[CATransitionanimation]; animation.duration=0.5f; animation.timingFunction=[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseInEaseOut]; animation.type=@"oglFlip"; if(iDevice.position==AVCaptureDevicePositionBack){ animation.subtype=kCATransitionFromLeft; for(AVCaptureDevice*deviceinarray){ if(device.position==AVCaptureDevicePositionFront){ newDevice=device; } } }elseif(iDevice.position==AVCaptureDevicePositionFront){ animation.subtype=kCATransitionFromRight; for(AVCaptureDevice*deviceinarray){ if(device.position==AVCaptureDevicePositionBack){ newDevice=device; } } } newDeviceInput=[AVCaptureDeviceInputdeviceInputWithDevice:newDeviceerror:nil]; [iPreviewLayeraddAnimation:animationforKey:nil]; if(newDeviceInput!=nil){ [iSessionbeginConfiguration]; [iSessionremoveInput:iDeviceInput]; iSession.sessionPreset=[selfgetSessionPresetForDevice:newDevice]; if([iSessioncanAddInput:newDeviceInput]){ [iSessionaddInput:newDeviceInput]; iDeviceInput=newDeviceInput; iDevice=newDevice; }else{ [iSessionaddInput:iDeviceInput]; } [iSessioncommitConfiguration]; } }
点击屏幕对焦:
//点击屏幕对焦 -(void)focusTap:(UIGestureRecognizer*)tap{ CGPointtapPoint=[taplocationInView:self.view]; floatY=tapPoint.y; if(Y<60||Y>([UIScreenmainScreen].bounds.size.height-100)){ return; } [iDevicelockForConfiguration:nil]; if([iDeviceisFocusModeSupported:AVCaptureFocusModeAutoFocus]){ [iDevicesetFocusPointOfInterest:CGPointMake(tapPoint.x/self.view.frame.origin.x,tapPoint.y/self.view.frame.origin.y)]; [iDevicesetFocusMode:AVCaptureFocusModeAutoFocus]; } [iDeviceunlockForConfiguration]; self.iFocusImgView.center=tapPoint; self.iFocusImgView.hidden=NO; [UIViewanimateWithDuration:0.3animations:^{ self.iFocusImgView.transform=CGAffineTransformMakeScale(1.25,1.25); }completion:^(BOOLfinished){ [UIViewanimateWithDuration:0.5animations:^{ self.iFocusImgView.transform=CGAffineTransformIdentity; }completion:^(BOOLfinished){ self.iFocusImgView.hidden=YES; }]; }]; }
关于视频录制可以在Demo中查看。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。