zoukankan      html  css  js  c++  java
  • iPhone摄像头设备获取

    LINK ADDRESS:http://www.cocoachina.com/bbs/read.php?tid=51754&fpage=2

    又写了个新版的帖子,看不懂怎么用的看本人这个新贴,在不懂,那我也没办法了。
    iPhone摄像头设备获取(分离简化版)



    目的:打开、关闭前置摄像头,绘制图像,并获取摄像头的二进制数据。
    需要的库
    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
    详情见代码,代码拷过去可以直接使用      Over!!!!


    代码:
    文件

    //
    //  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 (nonatomicretain) AVCaptureSession *avCaptureSession;
    @property (nonatomicretain) 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])
    {
    firstFrameYES;
    producerFps50;
    }
    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= [[UILabelallocinitWithFrame:CGRectMake(102022030)];
    labelState.backgroundColor= [UIColorclearColor];
    [self.viewaddSubview:labelState];
    [labelStaterelease];

    btnStartVideo= [[UIButtonallocinitWithFrame:CGRectMake(203508050)];
    [btnStartVideosetTitle:@"Star"forState:UIControlStateNormal];


    [btnStartVideosetBackgroundImage:[UIImageimageNamed:@"Images/button.png"forState:UIControlStateNormal];
    [btnStartVideoaddTarget:selfaction:@selector(startVideoCaptureforControlEvents:UIControlEventTouchUpInside];
    [self.viewaddSubview:btnStartVideo];
    [btnStartVideorelease];

    UIButton* stop = [[UIButtonallocinitWithFrame:CGRectMake(1203508050)];
    [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= [[UIViewallocinitWithFrame:CGRectMake(4050200300)];
    [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->avCaptureDevicenil;
            return;
        }

        self->avCaptureSession = [[AVCaptureSession allocinit];
        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 allocinit];
    NSDictionary*settings = [[NSDictionaryallocinitWithObjectsAndKeys:
    //[NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange], kCVPixelBufferPixelFormatTypeKey,
    [NSNumbernumberWithInt:240], (id)kCVPixelBufferWidthKey,
                                  [NSNumber numberWithInt:320], (id)kCVPixelBufferHeightKey,
      nil];
        avCaptureVideoDataOutput.videoSettings = settings;
        [settings release];
        avCaptureVideoDataOutput.minFrameDuration = CMTimeMake(1self->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.videoGravityAVLayerVideoGravityResizeAspectFill;

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

    self->firstFrameYES;
        [self->avCaptureSession startRunning];

    [labelStatesetText:@"Video capture started"];

    }
    - (void)stopVideoCapture:(id)arg
    {
    //停止摄像头捕抓
    if(self->avCaptureSession){
    [self->avCaptureSession stopRunning];
    self->avCaptureSessionnil;
    [labelStatesetText:@"Video capture stopped"];
    }
    self->avCaptureDevicenil;
    //移除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

  • 相关阅读:
    【郑轻邀请赛 G】密室逃脱
    【郑轻邀请赛 C】DOBRI
    【郑轻邀请赛 F】 Tmk吃汤饭
    【郑轻邀请赛 I】这里是天堂!
    【郑轻邀请赛 B】base64解密
    【郑轻邀请赛 A】tmk射气球
    【郑轻邀请赛 H】 维克兹的进制转换
    解决adb command not found以及sdk环境配置
    adb shell 命令详解,android, adb logcat
    Unexpected exception 'Cannot run program ... error=2, No such file or directory' ... adb'
  • 原文地址:https://www.cnblogs.com/xingchen/p/2271393.html
Copyright © 2011-2022 走看看