您的位置:首页 > 移动开发 > IOS开发

ios4下不使用私有API,轻松打开摄像头,获取摄像流

2014-03-13 20:43 429 查看
第一步:初始化***CaptureSession,添加输入,输出源

C代码


#import <***Foundation/***Foundation.h>



// Create and configure a capture session and start it running

- (void)setupCaptureSession

{

NSError *error = nil;



// Create the session

***CaptureSession *session = [[***CaptureSession alloc] init];



// Configure the session to produce lower resolution video frames, if your

// processing algorithm can cope. We'll specify medium quality for the

// chosen device.

session.sessionPreset = ***CaptureSessionPresetMedium;



// Find a suitable ***CaptureDevice

***CaptureDevice *device = [***CaptureDevice

defaultDeviceWithMediaType:***MediaTypeVideo];



// Create a device input with the device and add it to the session.

***CaptureDeviceInput *input = [***CaptureDeviceInput deviceInputWithDevice:device

error:&error];

if (!input) {

// Handling the error appropriately.

}

[session addInput:input];



// Create a VideoDataOutput and add it to the session

***CaptureVideoDataOutput *output = [[[***CaptureVideoDataOutput alloc] init] autorelease];

[session addOutput:output];



// Configure your output.

dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);

[output setSampleBufferDelegate:self queue:queue];

dispatch_release(queue);



// Specify the pixel format

output.videoSettings =

[NSDictionary dictionaryWithObject:

[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]

forKey:(id)kCVPixelBufferPixelFormatTypeKey];





// If you wish to cap the frame rate to a known value, such as 15 fps, set

// minFrameDuration.

output.minFrameDuration = CMTimeMake(1, 15);



// Start the session running to start the flow of data

[session startRunning];



// Assign session to an ivar.

[self setSession:session];

}

第二步:实现***CaptureVideoDataOutputSampleBufferDelegate协议方法

C代码


// Delegate routine that is called when a sample buffer was written

- (void)captureOutput:(***CaptureOutput *)captureOutput

didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer

fromConnection:(***CaptureConnection *)connection

{

// Create a UIImage from the sample buffer data

UIImage *image = [self imageFromSampleBuffer:sampleBuffer];



< Add your code here that uses the image >



}



// Create a UIImage from sample buffer data

- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer

{

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

// Lock the base address of the pixel buffer

CVPixelBufferLockBaseAddress(imageBuffer,0);



// Get the number of bytes per row for the pixel buffer

size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);

// Get the pixel buffer width and height

size_t width = CVPixelBufferGetWidth(imageBuffer);

size_t height = CVPixelBufferGetHeight(imageBuffer);



// Create a device-dependent RGB color space

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

if (!colorSpace)

{

NSLog(@"CGColorSpaceCreateDeviceRGB failure");

return nil;

}



// Get the base address of the pixel buffer

void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);

// Get the data size for contiguous planes of the pixel buffer.

size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);



// Create a Quartz direct-access data provider that uses data we supply

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize,

NULL);

// Create a bitmap image from data supplied by our data provider

CGImageRef cgImage =

CGImageCreate(width,

height,

8,

32,

bytesPerRow,

colorSpace,

kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,

provider,

NULL,

true,

kCGRenderingIntentDefault);

CGDataProviderRelease(provider);

CGColorSpaceRelease(colorSpace);



// Create and return an image object representing the specified Quartz image

UIImage *image = [UIImage imageWithCGImage:cgImage];

CGImageRelease(cgImage);



CVPixelBufferUnlockBaseAddress(imageBuffer, 0);



return image;

}

好了,现在就可以自由的显示和分析获取的UIImage了,再也不用使用私有API了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: