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

第一步:初始化AVCaptureSession,添加输入,输出源 
C代码   收藏代码
  1. #import <AVFoundation/AVFoundation.h>  
  2.   
  3. // Create and configure a capture session and start it running  
  4. - (void)setupCaptureSession   
  5. {  
  6.     NSError *error = nil;  
  7.   
  8.     // Create the session  
  9.     AVCaptureSession *session = [[AVCaptureSession alloc] init];  
  10.   
  11.     // Configure the session to produce lower resolution video frames, if your   
  12.     // processing algorithm can cope. We'll specify medium quality for the  
  13.     // chosen device.  
  14.     session.sessionPreset = AVCaptureSessionPresetMedium;  
  15.   
  16.     // Find a suitable AVCaptureDevice  
  17.     AVCaptureDevice *device = [AVCaptureDevice  
  18.                              defaultDeviceWithMediaType:AVMediaTypeVideo];  
  19.   
  20.     // Create a device input with the device and add it to the session.  
  21.     AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device   
  22.                                                                     error:&error];  
  23.     if (!input) {  
  24.         // Handling the error appropriately.  
  25.     }  
  26.     [session addInput:input];  
  27.   
  28.     // Create a VideoDataOutput and add it to the session  
  29.     AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];  
  30.     [session addOutput:output];  
  31.   
  32.     // Configure your output.  
  33.     dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);  
  34.     [output setSampleBufferDelegate:self queue:queue];  
  35.     dispatch_release(queue);  
  36.   
  37.     // Specify the pixel format  
  38.     output.videoSettings =   
  39.                 [NSDictionary dictionaryWithObject:  
  40.                     [NSNumber numberWithInt:kCVPixelFormatType_32BGRA]   
  41.                     forKey:(id)kCVPixelBufferPixelFormatTypeKey];  
  42.   
  43.   
  44.     // If you wish to cap the frame rate to a known value, such as 15 fps, set   
  45.     // minFrameDuration.  
  46.     output.minFrameDuration = CMTimeMake(1, 15);  
  47.   
  48.     // Start the session running to start the flow of data  
  49.     [session startRunning];  
  50.   
  51.     // Assign session to an ivar.  
  52.     [self setSession:session];  
  53. }  

第二步:实现AVCaptureVideoDataOutputSampleBufferDelegate协议方法 
C代码   收藏代码
  1. // Delegate routine that is called when a sample buffer was written  
  2. - (void)captureOutput:(AVCaptureOutput *)captureOutput   
  3.          didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer   
  4.          fromConnection:(AVCaptureConnection *)connection  
  5. {   
  6.     // Create a UIImage from the sample buffer data  
  7.     UIImage *image = [self imageFromSampleBuffer:sampleBuffer];  
  8.   
  9.      < Add your code here that uses the image >  
  10.   
  11. }  
  12.   
  13. // Create a UIImage from sample buffer data  
  14. - (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer   
  15. {  
  16.     CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);  
  17.     // Lock the base address of the pixel buffer  
  18.     CVPixelBufferLockBaseAddress(imageBuffer,0);  
  19.   
  20.     // Get the number of bytes per row for the pixel buffer  
  21.     size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);   
  22.     // Get the pixel buffer width and height  
  23.     size_t width = CVPixelBufferGetWidth(imageBuffer);   
  24.     size_t height = CVPixelBufferGetHeight(imageBuffer);   
  25.   
  26.     // Create a device-dependent RGB color space  
  27.     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();   
  28.     if (!colorSpace)   
  29.     {  
  30.         NSLog(@"CGColorSpaceCreateDeviceRGB failure");  
  31.         return nil;  
  32.     }  
  33.   
  34.     // Get the base address of the pixel buffer  
  35.     void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);  
  36.     // Get the data size for contiguous planes of the pixel buffer.  
  37.     size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);   
  38.   
  39.     // Create a Quartz direct-access data provider that uses data we supply  
  40.     CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize,   
  41.                                                             NULL);  
  42.     // Create a bitmap image from data supplied by our data provider  
  43.     CGImageRef cgImage =   
  44.         CGImageCreate(width,  
  45.                         height,  
  46.                         8,  
  47.                         32,  
  48.                         bytesPerRow,  
  49.                         colorSpace,  
  50.                         kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,  
  51.                         provider,  
  52.                         NULL,  
  53.                         true,  
  54.                         kCGRenderingIntentDefault);  
  55.     CGDataProviderRelease(provider);  
  56.     CGColorSpaceRelease(colorSpace);  
  57.   
  58.     // Create and return an image object representing the specified Quartz image  
  59.     UIImage *image = [UIImage imageWithCGImage:cgImage];  
  60.     CGImageRelease(cgImage);  
  61.   
  62.     CVPixelBufferUnlockBaseAddress(imageBuffer, 0);  
  63.   
  64.     return image;  
  65. }  

好了,现在就可以自由的显示和分析获取的UIImage了,再也不用使用私有API了

你可能感兴趣的:(ios4下不使用私有API,轻松打开摄像头,获取摄像流)