美文网首页
AVCapture-Camera

AVCapture-Camera

作者: ElaineYin | 来源:发表于2018-05-18 16:23 被阅读19次

    对AVCapture不太理解的童鞋请看上一篇:AVCapture详解

    需要Camera Demo的童鞋可以直接下载

    下面就做个自定义相机的练习

    tips:练习用的output是AVCaptureStillImageOutput,iOS10之后用 AVCapturePhotoOutput,请童鞋们注意适配

    1. 首先定义一下Camera需要用到的AVCapture对象
    //session
    AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
    //设置session采集质量 
    captureSession.sessionPreset = AVCaptureSessionPresetPhoto;
    //摄像头
    AVCaptureDevice  *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //输入流
    NSError *error;
    AVCaptureDeviceInput  *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
    //输出流
    AVCaptureStillImageOutput  *imageOutput = [[AVCaptureStillImageOutput alloc] init];
    // 这是输出流的设置参数AVVideoCodecJPEG参数表示以JPEG的图片格式输出图片
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil];
    [imageOutput setOutputSettings:outputSettings];
    
    1. 给session添加input、output
    - (void)sessionConfig {
        [self.captureSession beginConfiguration];
        if ([self.captureSession canAddInput:self.captureInput]) {
            [self.captureSession addInput:self.captureInput];
        }
        if ([self.captureSession canAddOutput:self.imageOutput]) {
            [self.captureSession addOutput:self.imageOutput];
        }
        [self.captureSession commitConfiguration];
    }
    
    1. 添加摄像头预览
    AVCaptureVideoPreviewLayer *preLayer = [AVCaptureVideoPreviewLayer layerWithSession: captureSession];
    preLayer.frame = self.view.bounds;
    preLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    [self.view.layer addSublayer:preLayer];
    
    1. 启动session
    //启动
    [self.captureSession startRunning];
    
    1. 拍照
      利用AVCaptureStillImageOutput和AVCaptureConnection获取CMSampleBufferRef,再转换成UIImage
    AVCaptureConnection *conntion = [self.imageOutput connectionWithMediaType:AVMediaTypeVideo];
    [self.imageOutput captureStillImageAsynchronouslyFromConnection:conntion completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
        if (error || imageDataSampleBuffer == nil) {
             return;
         }
         NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
         UIImage *image = [UIImage imageWithData:imageData];
     }];
    

    相关文章

      网友评论

          本文标题:AVCapture-Camera

          本文链接:https://www.haomeiwen.com/subject/gxubdftx.html