iOS框架AVFoundation实现相机拍照、录制视频

 更新时间:2018年05月08日 08:33:27   作者:有点纠结  
这篇文章主要为大家详细介绍了iOS框架AVFoundation实现相机拍照、录制视频功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了使用AVFoundation框架实现相机拍照、录制视频的具体代码,供大家参考,具体内容如下

这里是Demo

首先声明以下对象:

#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 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; 
  }]; 
 }]; 
} 

关于视频录制可以在Demo中查看。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • iOS CoreAnimation 图层几何学

    iOS CoreAnimation 图层几何学

    本文主要介绍了iOS CoreAnimation图层几何学,图层几何所讲主要是有关图层的位置,尺寸等几何类属性。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 汇总ios开发逆向传值的方法

    汇总ios开发逆向传值的方法

    这篇文章主要为大家汇总了ios开发逆向传值的方法,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 谈谈iOS中的多继承与多重代理

    谈谈iOS中的多继承与多重代理

    这篇文章主要给大家介绍了关于iOS中多继承与多重代理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • iOS实现自定义日期选择器示例

    iOS实现自定义日期选择器示例

    本篇文章主要介绍了iOS实现自定义日期选择器示例,可以显示年月日时分,非常具有实用价值,需要的朋友可以参考下。
    2017-02-02
  • iOS中wkwebView内存泄漏与循环引用问题详解

    iOS中wkwebView内存泄漏与循环引用问题详解

    这篇文章主要给大家介绍了关于iOS中wkwebView内存泄漏与循环引用问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 举例讲解iOS中延迟加载和上拉刷新/下拉加载的实现

    举例讲解iOS中延迟加载和上拉刷新/下拉加载的实现

    这篇文章主要介绍了举例讲解iOS中延迟加载和上拉刷新/下拉加载的实现,语言依然为传统的Objective-C,需要的朋友可以参考下
    2015-09-09
  • iOS 实现类似QQ分组样式的两种方式

    iOS 实现类似QQ分组样式的两种方式

    这篇文章主要介绍了iOS 实现类似QQ分组样式的两种方式,思路很简单,对模型数据操作或则控制界面显示,需要的朋友可以参考下
    2017-07-07
  • iOS多线程实现多图下载功能

    iOS多线程实现多图下载功能

    这篇文章主要为大家详细介绍了iOS多线程实现多图下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 详解如何使用ReactiveObjC

    详解如何使用ReactiveObjC

    RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架,能够通过信号提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件,现在分为 ReactiveObjC(OC) 和 ReactiveSwift(swift)。本文将详细介绍如何使用ReactiveObjC。
    2021-06-06
  • IOS 打包静态库详细介绍

    IOS 打包静态库详细介绍

    这篇文章主要介绍了IOS 打包静态库详细介绍的相关资料,这里对打包静态库做了详细的说明,并进行了总结,需要的朋友可以参考下
    2016-11-11

最新评论