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

前端之家收集整理的这篇文章主要介绍了iOS自定义相机实现拍照、录制视频前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了iOS自定义相机实现拍照、录制视频的具体代码,供大家参考,具体内容如下

使用AVFoundation框架。

这里是Demo

首先声明以下对象:

  1. #import "CustomeCameraViewController.h"
  2. #import <AVFoundation/AVFoundation.h>
  3. #import <AssetsLibrary/AssetsLibrary.h>
  4.  
  5. @interface CustomeCameraViewController ()<AVCaptureFileOutputRecordingDelegate>
  6.  
  7. {
  8. // AVCaptureSession对象来执行输入设备和输出设备之间的数据传递
  9. AVCaptureSession *iSession;
  10. //当前设备
  11. AVCaptureDevice *iDevice;
  12. //输入设备
  13. AVCaptureDeviceInput *iDeviceInput;
  14. //照片输出
  15. AVCaptureStillImageOutput *iStillImageOutput;
  16. //预览图层
  17. AVCaptureVideoPreviewLayer *iPreviewLayer;
  18.  
  19. }

初始化各对象:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3.  
  4. //点击屏幕对焦
  5. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(focusTap:)];
  6. [self.view addGestureRecognizer:tap];
  7.  
  8. iSession = [[AVCaptureSession alloc]init];
  9.  
  10. NSArray *deviceArray = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
  11. for (AVCaptureDevice *device in deviceArray) {
  12.  
  13. //AVCaptureDevicePositionBack 后置摄像头
  14. //AVCaptureDevicePositionFront 前置摄像头
  15. if (device.position == AVCaptureDevicePositionBack) {
  16. iDevice = device;
  17. }
  18. }
  19.  
  20. iSession.sessionPreset = [self getSessionPresetForDevice:iDevice];
  21.  
  22. iDeviceInput = [[AVCaptureDeviceInput alloc]initWithDevice:iDevice error:nil];
  23.  
  24. ////输出设置。AVVideoCodecJPEG 输出jpeg格式图片
  25. iStillImageOutput = [[AVCaptureStillImageOutput alloc]init];
  26. NSDictionary *outputDic = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil];
  27. [iStillImageOutput setOutputSettings:outputDic];
  28.  
  29. //更改这个设备设置的时候必须先锁定设备,修改完后再解锁,否则崩溃
  30. [iDevice lockForConfiguration:nil];
  31. if ([iDevice isFlashModeSupported:AVCaptureFlashModeOff]) {
  32. [iDevice setFlashMode:AVCaptureFlashModeOff];
  33. }
  34. if ([iDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
  35. [iDevice setFocusMode:AVCaptureFocusModeAutoFocus];
  36. }
  37. if ([iDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeAutoWhiteBalance]) {
  38. [iDevice setWhiteBalanceMode:AVCaptureWhiteBalanceModeAutoWhiteBalance];
  39. }
  40. [iDevice unlockForConfiguration];
  41.  
  42. if ([iSession canAddInput:iDeviceInput]) {
  43. [iSession addInput:iDeviceInput];
  44. }
  45. if ([iSession canAddOutput:iStillImageOutput]) {
  46. [iSession addOutput:iStillImageOutput];
  47. }
  48. if ([iSession canAddOutput:iVideoOutput]) {
  49. [iSession addOutput:iVideoOutput];
  50. }
  51.  
  52. //初始化预览图层
  53. iPreviewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:iSession];
  54. [iPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
  55. iPreviewLayer.frame = CGRectMake(0,60,[UIScreen mainScreen].bounds.size.width,[UIScreen mainScreen].bounds.size.height-160);
  56. [self.iCameraView.layer addSublayer:iPreviewLayer];
  57.  
  58. [iSession startRunning];
  59.  
  60. }

点击按钮拍照:

  1. //拍照
  2. -(void)takePictures{
  3. AVCaptureConnection *connection = [iStillImageOutput connectionWithMediaType:AVMediaTypeVideo];
  4. if (!connection) {
  5. NSLog(@"失败");
  6. return;
  7. }
  8. //设置焦距
  9. [connection setVideoScaleAndCropFactor:1];
  10.  
  11. [iStillImageOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer,NSError *error) {
  12. if (imageDataSampleBuffer==NULL) {
  13. NSLog(@"NUll");
  14. return ;
  15. }
  16.  
  17. NSData *data = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
  18. UIImage *image = [UIImage imageWithData:data];
  19.  
  20. }];
  21. }

image即为拍照所得图片

设置session的AVCaptureSessionPreset属性

  1. -(NSString *)getSessionPresetForDevice:(AVCaptureDevice *)device{
  2. if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset3840x2160]) {
  3. return AVCaptureSessionPreset3840x2160;
  4. } else if([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset1920x1080]){
  5. return AVCaptureSessionPreset1920x1080;
  6. } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset1280x720]){
  7. return AVCaptureSessionPreset1280x720;
  8. } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset640x480]){
  9. return AVCaptureSessionPreset640x480;
  10. } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPreset352x288]){
  11. return AVCaptureSessionPreset352x288;
  12. } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPresetHigh]){
  13. return AVCaptureSessionPresetHigh;
  14. } else if ([device supportsAVCaptureSessionPreset:AVCaptureSessionPresetMedium]){
  15. return AVCaptureSessionPresetMedium;
  16. } else{
  17. return AVCaptureSessionPresetLow;
  18. }
  19. }

设置闪光灯:

  1. - (IBAction)iFlashBtn:(id)sender {
  2.  
  3. [iDevice lockForConfiguration:nil];
  4. if (iDevice.flashMode == AVCaptureFlashModeOff) {
  5. if ([iDevice isFlashModeSupported:AVCaptureFlashModeOn]) {
  6. [iDevice setFlashMode:AVCaptureFlashModeOn];
  7.  
  8. [self.iFlashBtn setBackgroundImage:[UIImage imageNamed:@"flashBtn"] forState:UIControlStateNormal];
  9. }
  10. } else if (iDevice.flashMode == AVCaptureFlashModeOn){
  11. if ([iDevice isFlashModeSupported:AVCaptureFlashModeOff]) {
  12. [iDevice setFlashMode:AVCaptureFlashModeOff];
  13.  
  14. [self.iFlashBtn setBackgroundImage:[UIImage imageNamed:@"flashOffBtn"] forState:UIControlStateNormal];
  15. }
  16. }
  17. [iDevice unlockForConfiguration];
  18.  
  19. }

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

  1. - (IBAction)iChangeBtn:(id)sender {
  2.  
  3. NSArray *array = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
  4. AVCaptureDevice *newDevice = nil;
  5. AVCaptureDeviceInput *newDeviceInput = nil;
  6.  
  7. CATransition *animation = [CATransition animation];
  8. animation.duration = 0.5f;
  9. animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaSEOut];
  10. animation.type = @"oglFlip";
  11.  
  12. if (iDevice.position == AVCaptureDevicePositionBack) {
  13. animation.subtype = kCATransitionFromLeft;
  14. for (AVCaptureDevice *device in array) {
  15. if (device.position == AVCaptureDevicePositionFront) {
  16. newDevice = device;
  17. }
  18. }
  19. } else if (iDevice.position == AVCaptureDevicePositionFront){
  20. animation.subtype = kCATransitionFromRight;
  21. for (AVCaptureDevice *device in array) {
  22. if (device.position == AVCaptureDevicePositionBack) {
  23. newDevice = device;
  24. }
  25. }
  26. }
  27.  
  28. newDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:newDevice error:nil];
  29. [iPreviewLayer addAnimation:animation forKey:nil];
  30. if (newDeviceInput!=nil) {
  31. [iSession beginConfiguration];
  32. [iSession removeInput:iDeviceInput];
  33. iSession.sessionPreset = [self getSessionPresetForDevice:newDevice];
  34. if ([iSession canAddInput:newDeviceInput]) {
  35. [iSession addInput:newDeviceInput];
  36. iDeviceInput = newDeviceInput;
  37. iDevice = newDevice;
  38. } else {
  39. [iSession addInput:iDeviceInput];
  40. }
  41. [iSession commitConfiguration];
  42. }
  43.  
  44. }

点击屏幕对焦:

  1. //点击屏幕对焦
  2. -(void)focusTap:(UIGestureRecognizer *)tap{
  3. CGPoint tapPoint = [tap locationInView:self.view];
  4.  
  5. float Y = tapPoint.y;
  6. if (Y<60 || Y>([UIScreen mainScreen].bounds.size.height-100)) {
  7. return;
  8. }
  9.  
  10. [iDevice lockForConfiguration:nil];
  11. if ([iDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
  12. [iDevice setFocusPointOfInterest:CGPointMake(tapPoint.x/self.view.frame.origin.x,tapPoint.y/self.view.frame.origin.y)];
  13. [iDevice setFocusMode:AVCaptureFocusModeAutoFocus];
  14. }
  15. [iDevice unlockForConfiguration];
  16.  
  17. self.iFocusImgView.center = tapPoint;
  18. self.iFocusImgView.hidden = NO;
  19. [UIView animateWithDuration:0.3 animations:^{
  20. self.iFocusImgView.transform = CGAffineTransformMakeScale(1.25,1.25);
  21. }completion:^(BOOL finished) {
  22. [UIView animateWithDuration:0.5 animations:^{
  23. self.iFocusImgView.transform = CGAffineTransformIdentity;
  24. } completion:^(BOOL finished) {
  25. self.iFocusImgView.hidden = YES;
  26. }];
  27. }];
  28. }

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

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

猜你在找的iOS相关文章