经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS自定义相机实现拍照、录制视频
来源:jb51  时间:2019/4/22 8:38:00  对本文有异议

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

使用AVFoundation框架。

这里是Demo

首先声明以下对象:

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

初始化各对象:

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

点击按钮拍照:

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

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. [iDevice lockForConfiguration:nil];
  3. if (iDevice.flashMode == AVCaptureFlashModeOff) {
  4. if ([iDevice isFlashModeSupported:AVCaptureFlashModeOn]) {
  5. [iDevice setFlashMode:AVCaptureFlashModeOn];
  6. [self.iFlashBtn setBackgroundImage:[UIImage imageNamed:@"flashBtn"] forState:UIControlStateNormal];
  7. }
  8. } else if (iDevice.flashMode == AVCaptureFlashModeOn){
  9. if ([iDevice isFlashModeSupported:AVCaptureFlashModeOff]) {
  10. [iDevice setFlashMode:AVCaptureFlashModeOff];
  11. [self.iFlashBtn setBackgroundImage:[UIImage imageNamed:@"flashOffBtn"] forState:UIControlStateNormal];
  12. }
  13. }
  14. [iDevice unlockForConfiguration];
  15. }

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

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

点击屏幕对焦:

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

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号