iOS如何自定义相机实现拍照、录制视频
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了iOS如何自定义相机实现拍照、录制视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下使用AVFounda
千家信息网最后更新 2026年11月01日iOS如何自定义相机实现拍照、录制视频
这篇文章主要介绍了iOS如何自定义相机实现拍照、录制视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
具体内容如下
使用AVFoundation框架。
首先声明以下对象:
#import "CustomeCameraViewController.h"#import#import @interface CustomeCameraViewController () { // 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如何自定义相机实现拍照、录制视频"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
设备
摄像头
篇文章
摄像
输出
对象
屏幕
相机
视频
图片
输入
之间
价值
兴趣
内容
同时
属性
所得
按钮
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
瑰夏咖啡
科技互联网
上海挚品互联网科技有限公司
北京路客互联网科技有限公司
互联网科技开发公司
世界互联网领先科技成果
广州互联网络科技有限公司
无线互联网科技
有木互联网科技
互联网高科技企业
四川狮子座互联网科技
北京华百购互联网科技有限公司
新兴科技互联网创新大赛颁奖典礼
互联网科技与大数据专业
西安小鹰速贷互联网科技有限公司
长沙互联网科技
恒生互联网科技业指数调整周期
上海科技产业互联网平台
唯美互联网科技
绵阳真晨互联网科技有限公司
中智农互联网科技
互联网核心科技是什么
现代科技和互联网有关系吗
互联网科技中介
汽车互联网创新科技园
内蒙古九一互联网科技
银行科技岗属于互联网吗
城市宝互联网科技有限公司
福仕德教育科技互联网
美国五大互联网科技公司市值多少