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.
 
 
 
 

115 lines
4.0 KiB

//
// 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