首页 > 代码库 > iPhone摄像头设备获取

iPhone摄像头设备获取

 

转载自   http://blog.csdn.net/linzhiji/article/details/6730693

  1.   

目的:打开、关闭前置摄像头,绘制图像,并获取摄像头的二进制数据。需要的库AVFoundation.framework 、CoreVideo.framework 、CoreMedia.framework 、QuartzCore.framework该摄像头捕抓必须编译真机的版本,模拟器下编译不了。

函数说明

- (void)createControl{// UI界面控件的创建}

- (AVCaptureDevice *)getFrontCamera;获取前置摄像头设备

- (void)startVideoCapture;打开摄像头并开始捕捉图像其中代码:

AVCaptureVideoPreviewLayer* previewLayer = [AVCaptureVideoPreviewLayer layerWithSession: self->avCaptureSession];

previewLayer.frame = localView.bounds;

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

[self->localView.layer addSublayer: previewLayer]; 

为把图片画到UIView里面

- (void)stopVideoCapture:(id)arg;关闭摄像头,停止捕抓图像其中代码:

for(UIView*viewinself->localView.subviews) {[viewremoveFromSuperview];}

为移除摄像头图像的View详情见代码,代码拷过去可以直接使用     

 

代码:头文件:

 

//  //  AVCallController.h  //  Pxlinstall  //  //  Created by Lin Charlie C. on 11-3-24.  //  Copyright 2011  xxxx. All rights reserved.  //        #import <UIKit/UIKit.h>  #import <AVFoundation/AVFoundation.h>        @interface AVCallController : UIViewController <AVCaptureVideoDataOutputSampleBufferDelegate>  {      //UI      UILabel*labelState;      UIButton*btnStartVideo;      UIView*localView;            AVCaptureSession* avCaptureSession;      AVCaptureDevice *avCaptureDevice;      BOOLfirstFrame; //是否为第一帧      intproducerFps;              }   @property (nonatomic, retain) AVCaptureSession *avCaptureSession;   @property (nonatomic, retain) UILabel *labelState;              - (void)createControl;  - (AVCaptureDevice *)getFrontCamera;  - (void)startVideoCapture;  - (void)stopVideoCapture:(id)arg;  @end  

 

 


实现文件:

        //  AVCallController.m          //  Pxlinstall          //          //  Created by Lin Charlie C. on 11-3-24.          //  Copyright 2011  高鸿移通. All rights reserved.          //                              #import "AVCallController.h"                                                  @implementation AVCallController                              @synthesize avCaptureSession;          @synthesize labelState;                              // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.          /*          - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {              self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];              if (self) {                  // Custom initialization.              }              return self;          }          */          -(id)init          {          if(self= [superinit])          {          firstFrame= YES;          producerFps= 50;          }          returnself;          }                              // Implement loadView to create a view hierarchy programmatically, without using a nib.          - (void)loadView {          [superloadView];          [selfcreateControl];          }                                                  /*          // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.          - (void)viewDidLoad {              [super viewDidLoad];          }          */                              /*          // Override to allow orientations other than the default portrait orientation.          - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {              // Return YES for supported orientations.              return (interfaceOrientation == UIInterfaceOrientationPortrait);          }          */                              - (void)didReceiveMemoryWarning {          // Releases the view if it doesn‘t have a superview.          [superdidReceiveMemoryWarning];                    // Release any cached data, images, etc. that aren‘t in use.          }                              - (void)viewDidUnload {          [superviewDidUnload];          // Release any retained subviews of the main view.          // e.g. self.myOutlet = nil;          }                                                  - (void)dealloc {              [super dealloc];          }                              #pragma mark -          #pragma mark createControl          - (void)createControl          {          //UI展示          self.view.backgroundColor= [UIColorgrayColor];          labelState= [[UILabelalloc] initWithFrame:CGRectMake(10, 20, 220, 30)];          labelState.backgroundColor= [UIColorclearColor];          [self.viewaddSubview:labelState];          [labelStaterelease];                    btnStartVideo= [[UIButtonalloc] initWithFrame:CGRectMake(20, 350, 80, 50)];          [btnStartVideosetTitle:@"Star"forState:UIControlStateNormal];                              [btnStartVideosetBackgroundImage:[UIImageimageNamed:@"Images/button.png"] forState:UIControlStateNormal];          [btnStartVideoaddTarget:selfaction:@selector(startVideoCapture) forControlEvents:UIControlEventTouchUpInside];          [self.viewaddSubview:btnStartVideo];          [btnStartVideorelease];                    UIButton* stop = [[UIButtonalloc] initWithFrame:CGRectMake(120, 350, 80, 50)];          [stop setTitle:@"Stop"forState:UIControlStateNormal];                    [stop setBackgroundImage:[UIImageimageNamed:@"Images/button.png"] forState:UIControlStateNormal];          [stop addTarget:selfaction:@selector(stopVideoCapture:) forControlEvents:UIControlEventTouchUpInside];          [self.view addSubview:stop];          [stop release];                    localView= [[UIViewalloc] initWithFrame:CGRectMake(40, 50, 200, 300)];          [self.viewaddSubview:localView];          [localViewrelease];                              }          #pragma mark -          #pragma mark VideoCapture          - (AVCaptureDevice *)getFrontCamera          {          //获取前置摄像头设备          NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];              for (AVCaptureDevice *device in cameras)          {                  if (device.position == AVCaptureDevicePositionFront)                      return device;              }              return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];                    }          - (void)startVideoCapture          {          //打开摄像设备,并开始捕抓图像          [labelStatesetText:@"Starting Video stream"];          if(self->avCaptureDevice|| self->avCaptureSession)          {          [labelStatesetText:@"Already capturing"];          return;          }                    if((self->avCaptureDevice = [self getFrontCamera]) == nil)          {          [labelStatesetText:@"Failed to get valide capture device"];          return;          }                    NSError *error = nil;              AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:self->avCaptureDevice error:&error];              if (!videoInput)          {          [labelStatesetText:@"Failed to get video input"];          self->avCaptureDevice= nil;                  return;              }                        self->avCaptureSession = [[AVCaptureSession alloc] init];              self->avCaptureSession.sessionPreset = AVCaptureSessionPresetLow;              [self->avCaptureSession addInput:videoInput];                    // Currently, the only supported key is kCVPixelBufferPixelFormatTypeKey. Recommended pixel format choices are           // kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange or kCVPixelFormatType_32BGRA.           // On iPhone 3G, the recommended pixel format choices are kCVPixelFormatType_422YpCbCr8 or kCVPixelFormatType_32BGRA.          //              AVCaptureVideoDataOutput *avCaptureVideoDataOutput = [[AVCaptureVideoDataOutput alloc] init];          NSDictionary*settings = [[NSDictionaryalloc] initWithObjectsAndKeys:          //[NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange], kCVPixelBufferPixelFormatTypeKey,          [NSNumbernumberWithInt:240], (id)kCVPixelBufferWidthKey,                                        [NSNumber numberWithInt:320], (id)kCVPixelBufferHeightKey,            nil];              avCaptureVideoDataOutput.videoSettings = settings;              [settings release];              avCaptureVideoDataOutput.minFrameDuration = CMTimeMake(1, self->producerFps);          /*We create a serial queue to handle the processing of our frames*/          dispatch_queue_tqueue = dispatch_queue_create("org.doubango.idoubs", NULL);              [avCaptureVideoDataOutput setSampleBufferDelegate:self queue:queue];              [self->avCaptureSession addOutput:avCaptureVideoDataOutput];              [avCaptureVideoDataOutput release];          dispatch_release(queue);                    AVCaptureVideoPreviewLayer* previewLayer = [AVCaptureVideoPreviewLayer layerWithSession: self->avCaptureSession];          previewLayer.frame = localView.bounds;          previewLayer.videoGravity= AVLayerVideoGravityResizeAspectFill;                    [self->localView.layer addSublayer: previewLayer];                    self->firstFrame= YES;              [self->avCaptureSession startRunning];                    [labelStatesetText:@"Video capture started"];                    }          - (void)stopVideoCapture:(id)arg          {          //停止摄像头捕抓          if(self->avCaptureSession){          [self->avCaptureSession stopRunning];          self->avCaptureSession= nil;          [labelStatesetText:@"Video capture stopped"];          }          self->avCaptureDevice= nil;          //移除localView里面的内容          for(UIView*viewinself->localView.subviews) {          [viewremoveFromSuperview];          }          }          #pragma mark -          #pragma mark AVCaptureVideoDataOutputSampleBufferDelegate          - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection           {          //捕捉数据输出 要怎么处理虽你便          CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);          /*Lock the buffer*/          if(CVPixelBufferLockBaseAddress(pixelBuffer, 0) == kCVReturnSuccess)          {                  UInt8 *bufferPtr = (UInt8 *)CVPixelBufferGetBaseAddress(pixelBuffer);                  size_t buffeSize = CVPixelBufferGetDataSize(pixelBuffer);                    if(self->firstFrame)          {           if(1)          {          //第一次数据要求:宽高,类型          int width = CVPixelBufferGetWidth(pixelBuffer);          int height = CVPixelBufferGetHeight(pixelBuffer);                    int pixelFormat = CVPixelBufferGetPixelFormatType(pixelBuffer);          switch (pixelFormat) {          casekCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:          //TMEDIA_PRODUCER(producer)->video.chroma = tmedia_nv12; // iPhone 3GS or 4          NSLog(@"Capture pixel format=NV12");          break;          casekCVPixelFormatType_422YpCbCr8:          //TMEDIA_PRODUCER(producer)->video.chroma = tmedia_uyvy422; // iPhone 3          NSLog(@"Capture pixel format=UYUY422");          break;          default:          //TMEDIA_PRODUCER(producer)->video.chroma = tmedia_rgb32;          NSLog(@"Capture pixel format=RGB32");          break;          }                    self->firstFrame = NO;          }          }          /*We unlock the buffer*/          CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);               }          /*We create an autorelease pool because as we are not in the main_queue our code is           not executed in the main thread. So we have to create an autorelease pool for the thread we are in*/          // NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];          //           //    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);           //    /*Lock the image buffer*/          //    CVPixelBufferLockBaseAddress(imageBuffer,0);           //    /*Get information about the image*/          //    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);           //    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);           //    size_t width = CVPixelBufferGetWidth(imageBuffer);           //    size_t height = CVPixelBufferGetHeight(imageBuffer);            //              //    /*Create a CGImageRef from the CVImageBufferRef*/          //    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();           //    CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);          //    CGImageRef newImage = CGBitmapContextCreateImage(newContext);           //           //    /*We release some components*/          //    CGContextRelease(newContext);           //    CGColorSpaceRelease(colorSpace);          //              //    /*We display the result on the custom layer. All the display stuff must be done in the main thread because          //  UIKit is no thread safe, and as we are not in the main thread (remember we didn‘t use the main_queue)          //  we use performSelectorOnMainThread to call our CALayer and tell it to display the CGImage.*/          // [self.customLayer performSelectorOnMainThread:@selector(setContents:) withObject: (id) newImage waitUntilDone:YES];          //           // /*We display the result on the image view (We need to change the orientation of the image so that the video is displayed correctly).          //  Same thing as for the CALayer we are not in the main thread so ...*/          // UIImage *image= [UIImage imageWithCGImage:newImage scale:1.0 orientation:UIImageOrientationRight];          //           // /*We relase the CGImageRef*/          // CGImageRelease(newImage);          //           // [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];          //           // /*We unlock the  image buffer*/          // CVPixelBufferUnlockBaseAddress(imageBuffer,0);          //           // [pool drain];          }          @end 

 

iPhone摄像头设备获取