iOS自定义相机界面
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS自定义相机界面相关的知识,希望对你有一定的参考价值。
参考技术A 由于项目中需要拍照功能,但是系统原生的相机功能根本满足不了项目的需要,所以就只能自定义一个相加了。苹果再AVFoundation框架中给我们提供了各个api,我们完全可以通过这些api自定义一个满足我们需求的相机。AVCaptureSession 负责输入流和输出流的管理。
AVCaptureDeviceInput 输入流。连接输入采集设备的
AVCaptureStillImageOutput 输出流。AVCaptureOutput的子类,主要是负责采集图片数据的,不过这个类再10.0以后废弃掉了,改用AVCapturePhotoOutput这个替换,这个类能够支持RAW格式的图片
AVCaptureVideoPreviewLayer 集成CALayer,负责将采集的视频展示出来的一个类,提供了一个预览功能而已
1、AVCaptureSession的配置过程和startRunning是阻挡主线程的一个耗时操作,所以我们放到另外的queue中操作,能够避免阻挡主线程
2、由于我们拍照不需要质量非常高的照片,所以我们通过setOutputSettings设置了图片质量,这样减少了很大一部分内存,可以根据情况来设置图片的质量。
3、拍完照片图片是倒立的,所以我们做了一个旋转操作,将图片正立了过来
iOS自定义视频录制界面
相信在iOS应用里面很常用的功能之一就是视频录制了,但是往往系统的录制界面不是我们想要的,所以这时候就得自定义视频录制界面了.当然对很多人来讲的,AVFoundation这个库不是很熟.下面就一步步来实现一个自定义界面把!
创建UI以及相机采集工作
NSError *error = nil;
self.session = [[AVCaptureSession alloc] init];
//可以根据自己的需求来决定预览层的画质
_session.sessionPreset = AVCaptureSessionPresetLow;
AVCaptureDevice *frontCamera = nil;
AVCaptureDevice *backCamera = nil;
NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *camera in cameras)
if (camera.position == AVCaptureDevicePositionFront)
frontCamera = camera;
else
backCamera = camera;
if (!backCamera)
self.isCameraSupported = NO;
return;
else
self.isCameraSupported = YES;
if ([backCamera hasTorch])
self.isTorchSupported = YES;
else
self.isTorchSupported = NO;
if (!frontCamera)
self.isFrontCameraSupported = NO;
else
self.isFrontCameraSupported = YES;
[backCamera lockForConfiguration:nil];
if ([backCamera isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure])
[backCamera setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
[backCamera unlockForConfiguration];
// 用device对象创建一个设备对象input,并将其添加到session
self.videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:&error];
if (!_videoDeviceInput)
return;
[_session addInput:_videoDeviceInput];
AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio] error:nil];
if (!audioDeviceInput)
_output = [[AVCaptureVideoDataOutput alloc] init];
[_session addOutput:_output];
dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
[_output setSampleBufferDelegate:self queue:queue];
//这里作者我需要的是480*480的视频 所有先取640x480,后期通过裁剪来获取到480*480的 画质越高处理的速度相对较慢,所以根据自己的需求来定义
_session.sessionPreset = AVCaptureSessionPreset640x480;
dispatch_async(dispatch_get_main_queue(), ^
self.preViewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
_preViewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[_session commitConfiguration];
// 启动session
[_session startRunning];
self.preViewLayer.frame = CGRectMake(0, 0, MYSCREENWIDTH, MYSCREENWIDTH*4/4);
//preview是一个UIView,用来加载相机的预览层
[preview.layer addSublayer:self.preViewLayer];
);
获取视频流
#pragma mark 获取视频流
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
//在这里你可以获取到视频采集到的视频帧音频帧,具体要做什么操作 旋转啊 裁剪啊 之类的 就可以根据项目需求来决定
以上是关于iOS自定义相机界面的主要内容,如果未能解决你的问题,请参考以下文章