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