You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
4.0 KiB
116 lines
4.0 KiB
![]()
2 years ago
|
//
|
||
|
// XHCaptureHelper.m
|
||
|
// MessageDisplayExample
|
||
|
//
|
||
|
// Created by 曾 宪华 on 14-5-25.
|
||
|
// Copyright (c) 2014年 曾宪华 开发团队(http://iyilunba.com ) 本人QQ:543413507 本人QQ群(142557668). All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import "XHCaptureHelper.h"
|
||
|
|
||
|
@interface XHCaptureHelper ()
|
||
|
|
||
|
@property (nonatomic, copy) DidOutputSampleBufferBlock didOutputSampleBuffer;
|
||
|
|
||
|
@property (nonatomic, strong) dispatch_queue_t captureSessionQueue;
|
||
|
|
||
|
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *captureVideoPreviewLayer;
|
||
|
@property (nonatomic, strong) AVCaptureSession *captureSession;
|
||
|
@property (nonatomic, strong) AVCaptureDeviceInput *captureInput;
|
||
|
@property (nonatomic, strong) AVCaptureVideoDataOutput *captureOutput;
|
||
|
|
||
|
@end
|
||
|
|
||
|
@implementation XHCaptureHelper
|
||
|
|
||
|
- (void)setDidOutputSampleBufferHandle:(DidOutputSampleBufferBlock)didOutputSampleBuffer {
|
||
|
self.didOutputSampleBuffer = didOutputSampleBuffer;
|
||
|
}
|
||
|
|
||
|
- (void)showCaptureOnView:(UIView *)preview {
|
||
|
dispatch_async(self.captureSessionQueue, ^{
|
||
|
[self.captureSession startRunning];
|
||
|
|
||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||
|
self.captureVideoPreviewLayer.frame = preview.bounds;
|
||
|
[preview.layer addSublayer:self.captureVideoPreviewLayer];
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#pragma mark - Propertys
|
||
|
|
||
|
- (AVCaptureSession *)captureSession {
|
||
|
if (!_captureSession) {
|
||
|
_captureSession = [[AVCaptureSession alloc] init];
|
||
|
|
||
|
AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
|
||
|
|
||
|
_captureInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:nil];
|
||
|
if ([_captureSession canAddInput:self.captureInput])
|
||
|
[self.captureSession addInput:self.captureInput];
|
||
|
|
||
|
_captureOutput = [[AVCaptureVideoDataOutput alloc] init];
|
||
|
_captureOutput.alwaysDiscardsLateVideoFrames = YES;
|
||
|
[_captureOutput setSampleBufferDelegate:self queue:self.captureSessionQueue];
|
||
|
NSString *key = (NSString *)kCVPixelBufferPixelFormatTypeKey;
|
||
|
NSNumber *value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
|
||
|
NSDictionary *videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
|
||
|
[_captureOutput setVideoSettings:videoSettings];
|
||
|
[self.captureSession addOutput:self.captureOutput];
|
||
|
|
||
|
NSString* preset = 0;
|
||
|
if (NSClassFromString(@"NSOrderedSet") && // Proxy for "is this iOS 5" ...
|
||
|
[UIScreen mainScreen].scale > 1 &&
|
||
|
[inputDevice
|
||
|
supportsAVCaptureSessionPreset:AVCaptureSessionPresetiFrame960x540]) {
|
||
|
preset = AVCaptureSessionPresetiFrame960x540;
|
||
|
}
|
||
|
if (!preset) {
|
||
|
preset = AVCaptureSessionPresetMedium;
|
||
|
}
|
||
|
self.captureSession.sessionPreset = preset;
|
||
|
}
|
||
|
return _captureSession;
|
||
|
}
|
||
|
|
||
|
- (AVCaptureVideoPreviewLayer *)captureVideoPreviewLayer {
|
||
|
if (!_captureVideoPreviewLayer) {
|
||
|
_captureVideoPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];
|
||
|
_captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
|
||
|
}
|
||
|
return _captureVideoPreviewLayer;
|
||
|
}
|
||
|
|
||
|
#pragma mark - Life Cycle
|
||
|
|
||
|
- (id)init {
|
||
|
self = [super init];
|
||
|
if (self) {
|
||
|
_captureSessionQueue = dispatch_queue_create("com.HUAJIE.captureSessionQueue", 0);
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void)dealloc {
|
||
|
_captureSessionQueue = nil;
|
||
|
_captureVideoPreviewLayer = nil;
|
||
|
|
||
|
if (![_captureSession canAddOutput:self.captureOutput])
|
||
|
[_captureSession removeOutput:self.captureOutput];
|
||
|
self.captureOutput = nil;
|
||
|
|
||
|
[_captureSession stopRunning];
|
||
|
_captureSession = nil;
|
||
|
}
|
||
|
|
||
|
#pragma mark - AVCaptureVideoDataOutputSampleBuffer Delegate
|
||
|
|
||
|
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
|
||
|
if (self.didOutputSampleBuffer) {
|
||
|
self.didOutputSampleBuffer(sampleBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@end
|