国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

iOS如何自定義相機實(shí)現拍照、錄制視頻

發(fā)布時(shí)間:2021-09-27 17:50 來(lái)源:億速云 閱讀:0 作者:小新 欄目: 開(kāi)發(fā)技術(shù)

這篇文章主要介紹了iOS如何自定義相機實(shí)現拍照、錄制視頻,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著(zhù)大家一起了解一下。

具體內容如下

使用AVFoundation框架。

首先聲明以下對象:

#import "CustomeCameraViewController.h"#import <AVFoundation/AVFoundation.h>#import <AssetsLibrary/AssetsLibrary.h>@interface CustomeCameraViewController ()<AVCaptureFileOutputRecordingDelegate>{  // AVCaptureSession對象來(lái)執行輸入設備和輸出設備之間的數據傳遞  AVCaptureSession *iSession;  //當前設備  AVCaptureDevice *iDevice;  //輸入設備  AVCaptureDeviceInput *iDeviceInput;  //照片輸出流  AVCaptureStillImageOutput *iStillImageOutput;  //預覽圖層  AVCaptureVideoPreviewLayer *iPreviewLayer;}

初始化各對象:

- (void)viewDidLoad {  [super viewDidLoad];  //點(diǎn)擊屏幕對焦  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];  //更改這個(gè)設備設置的時(shí)候必須先鎖定設備,修改完后再解鎖,否則崩潰  [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];}

點(diǎn)擊按鈕拍照:

//拍照-(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];  }}

點(diǎn)擊屏幕對焦:

//點(diǎn)擊屏幕對焦-(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;    }];  }];}

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

iOS
1000部啪啪未满十八勿入| 国产综合色产在线视频欧美| 国产又黄又硬又粗| 国产专业剧情av在线| 国产成人一区二区三区免费| 国内永久福利在线视频图片|