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中查看。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。