国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

通過AVFoundation框架獲取攝像頭數據

2019-11-09 15:02:26
字體:
來源:轉載
供稿:網友
一、概述從iOS4開始,AVFoundation框架增加了幾個類,AVCaptureDevice、AVCapturesession等,可以獲取攝像頭的數據,而不會彈出類似于ImagePicker一樣的界面,我們可以將數據轉為一張張的圖片,然后我們可以即時顯示在視圖上,也可以使用FFMPEG或者其它的視頻編碼工具,來合成視頻。二、步驟第一步:創(chuàng)建AVCaptureSession,添加輸入,輸出源#import <AVFoundation/AVFoundation.h>//創(chuàng)建并配置一個攝像會話,并啟動。- (void)setupCaptureSession{    NSError *error = nil;    //創(chuàng)建會話    AVCaptureSession *session = [[AVCaptureSession alloc] init];    //設置視頻質量    session.sessionPReset = AVCaptureSessionPresetMedium;    //獲取合適的AVCaptureDevice    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];    //創(chuàng)建設備輸入流,并增加到會話。    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device                                                                    error:&error];    if (!input) {        //處理錯誤    }    [session addInput:input];    //創(chuàng)建一個視頻輸出流,并增加到會話。    AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];    [session addOutput:output];    //配置輸出流    dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);    [output setSampleBufferDelegate:self queue:queue];    dispatch_release(queue);    //指定像素格式。    output.videoSettings = [NSDictionary dictionaryWithObject:      [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];    //設置FPS    output.minFrameDuration = CMTimeMake(1, 15);    //啟動會話    [session startRunning];    //將會話與當前控制器關聯    [self setSession:session];}第二步:實現AVCaptureVideoDataOutputSampleBufferDelegate協議方法 //當采樣數據被寫入緩沖區(qū)時調用- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer         fromConnection:(AVCaptureConnection *)connection{    //抽取采樣數據,合成UIImage對象    UIImage *image = [self imageFromSampleBuffer:sampleBuffer];    //后續(xù)自定義處理    xxxxxxxx}//抽取采樣數據,合成UIImage對象- (UIImage *)imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer{    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);        //鎖定像素緩沖區(qū)的起始地址    CVPixelBufferLockBaseAddress(imageBuffer,0);    //獲取每行像素的字節(jié)數    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);        //獲取像素緩沖區(qū)的寬度和高度    size_t width = CVPixelBufferGetWidth(imageBuffer);    size_t height = CVPixelBufferGetHeight(imageBuffer);    //創(chuàng)建基于設備的RGB顏色空間    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();    if (!colorSpace)    {        NSLog(@"CGColorSpaceCreateDeviceRGB failure");        return nil;    }    //獲取像素緩沖區(qū)的起始地址    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);        //獲取像素緩沖區(qū)的數據大小    size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);    //使用提供的數據創(chuàng)建CGDataProviderRef    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize,NULL);        //通過CGDataProviderRef,創(chuàng)建CGImageRef    CGImageRef cgImage =        CGImageCreate(width,                        height,                        8,                        32,                        bytesPerRow,                        colorSpace,                        kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,                        provider,                        NULL,                        true,                        kCGRenderingIntentDefault);    CGDataProviderRelease(provider);    CGColorSpaceRelease(colorSpace);    //創(chuàng)建UIImage    UIImage *image = [UIImage imageWithCGImage:cgImage];    CGImageRelease(cgImage);    //解鎖像素緩沖區(qū)起始地址    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);    return image;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巴林左旗| 玉树县| 新闻| 永昌县| 如东县| 高台县| 江城| 义乌市| 楚雄市| 抚松县| 宣恩县| 林西县| 安徽省| 抚远县| 广宁县| 乳源| 塘沽区| 万盛区| 庐江县| 南充市| 林甸县| 钟祥市| 东乡| 平南县| 密云县| 沛县| 东山县| 平顶山市| 兴仁县| 高密市| 宣恩县| 西吉县| 淄博市| 晋宁县| 白银市| 清原| 天台县| 都昌县| 龙山县| 随州市| 钦州市|