摄像机画面的捕捉和预览

1、创建预览的PreviewView , 重写里面layer方法,替代为AVCaptureVideoPreviewLayer

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
NS_ASSUME_NONNULL_BEGIN

@interface PreviewView : UIView
@property (strong, nonatomic) AVCaptureSession *session;
@end

NS_ASSUME_NONNULL_END
//
//  PreviewView.m
//  摄像机画面的捕捉和预览
//
//  Created by 柯木超 on 2019/9/3.
//  Copyright © 2019 柯木超. All rights reserved.
//

#import "PreviewView.h"

@implementation PreviewView

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setupView];
    }
    return self;
}

+(Class)layerClass {
    
    return [AVCaptureVideoPreviewLayer class];
}
- (AVCaptureSession*)session {
    //重写session方法,返回捕捉会话
    return [(AVCaptureVideoPreviewLayer*)self.layer session];
}
-(void)setSession:(AVCaptureSession *)session {
    //重写session属性的访问方法,在setSession:方法中访问视图layer属性。
    //AVCaptureVideoPreviewLayer 实例,并且设置AVCaptureSession 将捕捉数据直接输出到图层中,并确保与会话状态同步。
    
    
    [(AVCaptureVideoPreviewLayer*)self.layer setSession:session];
}

//关于UI的实现
- (void)setupView {
    
    [(AVCaptureVideoPreviewLayer *)self.layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    
}
@end

ViewController部分

//
//  ViewController.m
//  摄像机画面的捕捉和预览
//
//  Created by 柯木超 on 2019/9/3.
//  Copyright © 2019 柯木超. All rights reserved.
//

#import "ViewController.h"
#import "PreviewView.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
@property (strong, nonatomic) PreviewView *previewView;
@property (strong, nonatomic) AVCaptureSession *captureSession;// 捕捉会话
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建secssion
    self.captureSession = [[AVCaptureSession alloc]init];
    
    /*
     AVCaptureSessionPresetHigh
     AVCaptureSessionPresetMedium
     AVCaptureSessionPresetLow
     AVCaptureSessionPreset640x480
     AVCaptureSessionPreset1280x720
     AVCaptureSessionPresetPhoto
     */
    //设置图像的分辨率
    self.captureSession.sessionPreset = AVCaptureSessionPresetHigh;
    
    // 1、添加device 拿到默认视频捕捉设备 iOS系统返回后置摄像头
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    
    // 2、给device封装 AVCaptureDeviceInput
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    
    // 3、捕捉设备输出
    //判断videoInput是否有效
    if (deviceInput){
        if([self.captureSession canAddInput:deviceInput]) {
            [self.captureSession addInput:deviceInput];
        }
    }
    
    // 4、捕捉链接 (捕捉image的时候需要用到)
    
    // 5、捕捉预览
    self.previewView = [[PreviewView alloc]initWithFrame:self.view.bounds];
    [self.previewView setSession:self.captureSession];
    [self.previewView.session startRunning];
    
    [self.view addSubview:self.previewView];
}

@end
发布了79 篇原创文章 · 获赞 42 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/s12117719679/article/details/100513400