温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

iOS如何自定义相机实现拍照、录制视频

发布时间:2021-09-27 14:33:32 来源:亿速云 阅读:149 作者:小新 栏目:编程语言

这篇文章主要介绍了iOS如何自定义相机实现拍照、录制视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体内容如下

使用AVFoundation框架。

首先声明以下对象:

#import "CustomeCameraViewController.h"#import <AVFoundation/AVFoundation.h>#import <AssetsLibrary/AssetsLibrary.h>@interface CustomeCameraViewController ()<AVCaptureFileOutputRecordingDelegate>{  // AVCaptureSession对象来执行输入设备和输出设备之间的数据传递  AVCaptureSession *iSession;  //当前设备  AVCaptureDevice *iDevice;  //输入设备  AVCaptureDeviceInput *iDeviceInput;  //照片输出流  AVCaptureStillImageOutput *iStillImageOutput;  //预览图层  AVCaptureVideoPreviewLayer *iPreviewLayer;}

初始化各对象:

- (void)viewDidLoad {  [super viewDidLoad];  //点击屏幕对焦  UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(focusTap:)];  [self.view addGestureRecognizer:tap];  iSession = [[AVCaptureSession alloc]init];  NSArray *deviceArray = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];  for (AVCaptureDevice *device in deviceArray) {    //AVCaptureDevicePositionBack 后置摄像头    //AVCaptureDevicePositionFront 前置摄像头    if (device.position == AVCaptureDevicePositionBack) {      iDevice = device;    }  }  iSession.sessionPreset = [self getSessionPresetForDevice:iDevice];  iDeviceInput = [[AVCaptureDeviceInput alloc]initWithDevice:iDevice error:nil];  ////输出设置。AVVideoCodecJPEG  输出jpeg格式图片  iStillImageOutput = [[AVCaptureStillImageOutput alloc]init];  NSDictionary *outputDic = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey, nil];  [iStillImageOutput setOutputSettings:outputDic];  //更改这个设备设置的时候必须先锁定设备,修改完后再解锁,否则崩溃  [iDevice lockForConfiguration:nil];  if ([iDevice isFlashModeSupported:AVCaptureFlashModeOff]) {    [iDevice setFlashMode:AVCaptureFlashModeOff];  }  if ([iDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {    [iDevice setFocusMode:AVCaptureFocusModeAutoFocus];  }  if ([iDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeAutoWhiteBalance]) {    [iDevice setWhiteBalanceMode:AVCaptureWhiteBalanceModeAutoWhiteBalance];  }  [iDevice unlockForConfiguration];  if ([iSession canAddInput:iDeviceInput]) {    [iSession addInput:iDeviceInput];  }  if ([iSession canAddOutput:iStillImageOutput]) {    [iSession addOutput:iStillImageOutput];  }  if ([iSession canAddOutput:iVideoOutput]) {    [iSession addOutput:iVideoOutput];  }  //初始化预览图层  iPreviewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:iSession];  [iPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];  iPreviewLayer.frame = CGRectMake(0, 60, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-160);  [self.iCameraView.layer addSublayer:iPreviewLayer];  [iSession startRunning];}

点击按钮拍照:

//拍照-(void)takePictures{  AVCaptureConnection *connection = [iStillImageOutput connectionWithMediaType:AVMediaTypeVideo];  if (!connection) {    NSLog(@"失败");    return;  }  //设置焦距  [connection setVideoScaleAndCropFactor:1];  [iStillImageOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {    if (imageDataSampleBuffer==NULL) {      NSLog(@"NUll");      return ;    }    NSData *data = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];    UIImage *image = [UIImage imageWithData:data];  }];}

image即为拍照所得图片:

设置session的AVCaptureSessionPreset属性

-(NSString *)getSessionPresetForDevice:(AVCaptureDevice *)device{  if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset3840x2160]) {    return AVCaptureSessionPreset3840x2160;  } else if([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset1920x1080]){    return AVCaptureSessionPreset1920x1080;  } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset1280x720]){    return AVCaptureSessionPreset1280x720;  } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset640x480]){    return AVCaptureSessionPreset640x480;  } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset352x288]){    return AVCaptureSessionPreset352x288;  } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPresetHigh]){    return AVCaptureSessionPresetHigh;  } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPresetMedium]){    return AVCaptureSessionPresetMedium;  } else{    return AVCaptureSessionPresetLow;  }}

设置闪光灯:

- (IBAction)iFlashBtn:(id)sender {  [iDevice lockForConfiguration:nil];  if (iDevice.flashMode == AVCaptureFlashModeOff) {    if ([iDevice isFlashModeSupported:AVCaptureFlashModeOn]) {      [iDevice setFlashMode:AVCaptureFlashModeOn];      [self.iFlashBtn setBackgroundImage:[UIImage imageNamed:@"flashBtn"] forState:UIControlStateNormal];    }  } else if (iDevice.flashMode == AVCaptureFlashModeOn){    if ([iDevice isFlashModeSupported:AVCaptureFlashModeOff]) {      [iDevice setFlashMode:AVCaptureFlashModeOff];       [self.iFlashBtn setBackgroundImage:[UIImage imageNamed:@"flashOffBtn"] forState:UIControlStateNormal];    }  }  [iDevice unlockForConfiguration];}

切换前置摄像头与后置摄像头:

- (IBAction)iChangeBtn:(id)sender {  NSArray *array = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];  AVCaptureDevice *newDevice = nil;  AVCaptureDeviceInput *newDeviceInput = nil;  CATransition *animation = [CATransition animation];  animation.duration = 0.5f;  animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];  animation.type = @"oglFlip";  if (iDevice.position == AVCaptureDevicePositionBack) {    animation.subtype = kCATransitionFromLeft;    for (AVCaptureDevice *device in array) {      if (device.position == AVCaptureDevicePositionFront) {        newDevice = device;      }    }  } else if (iDevice.position == AVCaptureDevicePositionFront){    animation.subtype = kCATransitionFromRight;    for (AVCaptureDevice *device in array) {      if (device.position == AVCaptureDevicePositionBack) {        newDevice = device;      }    }  }  newDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:newDevice error:nil];  [iPreviewLayer addAnimation:animation forKey:nil];  if (newDeviceInput!=nil) {    [iSession beginConfiguration];    [iSession removeInput:iDeviceInput];     iSession.sessionPreset = [self getSessionPresetForDevice:newDevice];    if ([iSession canAddInput:newDeviceInput]) {      [iSession addInput:newDeviceInput];      iDeviceInput = newDeviceInput;      iDevice = newDevice;    } else {      [iSession addInput:iDeviceInput];    }    [iSession commitConfiguration];  }}

点击屏幕对焦:

//点击屏幕对焦-(void)focusTap:(UIGestureRecognizer *)tap{  CGPoint tapPoint = [tap locationInView:self.view];  float Y = tapPoint.y;  if (Y<60 || Y>([UIScreen mainScreen].bounds.size.height-100)) {    return;  }  [iDevice lockForConfiguration:nil];  if ([iDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {    [iDevice setFocusPointOfInterest:CGPointMake(tapPoint.x/self.view.frame.origin.x, tapPoint.y/self.view.frame.origin.y)];    [iDevice setFocusMode:AVCaptureFocusModeAutoFocus];  }  [iDevice unlockForConfiguration];  self.iFocusImgView.center = tapPoint;  self.iFocusImgView.hidden = NO;  [UIView animateWithDuration:0.3 animations:^{    self.iFocusImgView.transform = CGAffineTransformMakeScale(1.25, 1.25);  }completion:^(BOOL finished) {    [UIView animateWithDuration:0.5 animations:^{      self.iFocusImgView.transform = CGAffineTransformIdentity;    } completion:^(BOOL finished) {      self.iFocusImgView.hidden = YES;    }];  }];}

感谢你能够认真阅读完这篇文章,希望小编分享的“iOS如何自定义相机实现拍照、录制视频”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ios
AI