通过AVFoundation框架获取摄像头数据

一、概述

从iOS4开始,AVFoundation框架增加了几个类,AVCaptureDevice、AVCaptureSession等,可以获取摄像头的数据,而不会弹出类似于ImagePicker一样的界面,我们可以将数据转为一张张的图片,然后我们可以即时显示在视图上,也可以使用FFMPEG或者其它的视频编码工具,来合成视频。

二、步骤

第一步:创建AVCaptureSession,添加输入,输出源

#import <AVFoundation/AVFoundation.h>

//创建并配置一个摄像会话,并启动。
- (void)setupCaptureSession
{
    NSError *error = nil;

    //创建会话
    AVCaptureSession *session = [[AVCaptureSession alloc] init];

    //设置视频质量
    session.sessionPreset = AVCaptureSessionPresetMedium;

    //获取合适的AVCaptureDevice
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    //创建设备输入流,并增加到会话。
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device
                                                                    error:&error];
    if (!input) {
        //处理错误
    }
    [session addInput:input];

    //创建一个视频输出流,并增加到会话。
    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协议方法
 
//当采样数据被写入缓冲区时调用
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
         fromConnection:(AVCaptureConnection *)connection
{
    //抽取采样数据,合成UIImage对象
    UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
    //后续自定义处理
    xxxxxxxx
}

//抽取采样数据,合成UIImage对象
- (UIImage *)imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    
    //锁定像素缓冲区的起始地址
    CVPixelBufferLockBaseAddress(imageBuffer,0);

    //获取每行像素的字节数
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    
    //获取像素缓冲区的宽度和高度
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);

    //创建基于设备的RGB颜色空间
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    if (!colorSpace)
    {
        NSLog(@"CGColorSpaceCreateDeviceRGB failure");
        return nil;
    }

    //获取像素缓冲区的起始地址
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
    
    //获取像素缓冲区的数据大小
    size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);

    //使用提供的数据创建CGDataProviderRef
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize,NULL);
    
    //通过CGDataProviderRef,创建CGImageRef
    CGImageRef cgImage =
        CGImageCreate(width,
                        height,
                        8,
                        32,
                        bytesPerRow,
                        colorSpace,
                        kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,
                        provider,
                        NULL,
                        true,
                        kCGRenderingIntentDefault);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    //创建UIImage
    UIImage *image = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    //解锁像素缓冲区起始地址
    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);

    return image;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库支持emoji表情的详解

mysql存储emoji表情的时候&#xff0c;就会报错&#xff0c;如下&#xff1a; Error updating database. Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x8A\xF0\x9F…’ for column ‘这是我表中的字段’ at row 1 初步定位是我的数据库是utf8编码…

CoreText使用介绍

一、概述 1.CoreText是苹果创建的一个用于文字排版的框架&#xff0c;可以实现文字排版、图文混排等复杂的界面效果。从iOS3.2启用。2.一个开源工具类-OHAttributedLabel&#xff0c;就是使用CoreText框架实现的&#xff0c;能够实现一个Label中有不同的文字大小、文字颜色、字…

编程规范:长函数的思考

在工作&#xff0c;我们应该都不想看到非常的长函数。对于一个运行5年左右的项目&#xff0c;极有可能出现这种情况。由于长函数的长、if/else嵌套&#xff0c;导致代码的可读性非常差&#xff0c;这对于项目的维护和开发带来了极大的困难。所以我们应该避免写长函数&#xff0…

用redis实现延迟队列

现在在用的redis实现延迟队列的主流程

iPhone各版本屏幕尺寸

设备宽高对角线逻辑分辨率(point)Scale Factor设备分辨率(pixel)PPI iPhoneWidthHeightDiagonal 3GS2.4 inches (62.1 mm)4.5 inches (115.5 mm)3.5-inch320x4801x320x480163 4(s)2.31 inches (58.6 mm)4.5 inches (115.2 mm)3.5-inch320x4802x640x960326 5c2.33 inches (59.2…

maven更新快照不起作用的解决方法

问题&#xff1a;maven的快照包更新后&#xff0c;调用方使用idea点下面这个地方更新maven&#xff0c;并没有拉到最新的快照 解决方法1 删除本地仓库的快照包&#xff0c;再重新拉一次 解决方法2 下图&#xff0c;这里点进去 下图&#xff0c;这个勾上就行了&#xff0c;再…

iOS中frame和Bounds之间的区别

frame frame是每个view必备的属性&#xff0c;代表的是当前视图的位置和大小&#xff0c;没有设置他&#xff0c;当前视图是看不到的。位置需要有参照物才能确定&#xff0c;数学中我们用坐标系来确定坐标系中的某个点的位置&#xff0c;iOS中有他特有的坐标系&#xff0c;如下…

[数据库]-----mysql数据的冷热分离 第二版

1.前提 这次数据库的冷热分离算是第二次做了 其实之前已经做过一次冷热分离了,涉及到数据库复制时,当时是趋近于业务的(后面会详细讲),整体来讲不是很好用,这次算是重构了吧 做的最终结果还是和前一次一样: 数据库中的订单数据,是每时每刻都在增加 我们认为3个月以内的数据,用…

URL结构

一、概念 URL&#xff1a;统一资源定位符 (Uniform Resource Locator, URL)。 完整的URL由这几个部分构成&#xff1a;scheme://host:port/path?query#hash&#xff1a; scheme&#xff1a;通信协议&#xff0c;常用的有http、https、ftp、mailto等。 host&#xff1a;主机…

[数据库]-----记一次mysql分库的操作(冷热分离)

前提: 1.原有库是mysql数据库,已经根据用户pin分片 2.每片是一主两从 3.主表已经分过表了 4.数据库所在服务器为4C8G 5.库中数据量已经超过千万,而且以每天3万多的数据持续增长,将来每天或许会更多 6.库内数据为订单数据&#xff0c;每时每刻都有新的订单产生&#xff0c;每个…

使用OC进行iOS截屏,同时保证清晰度

一般情况下我们使用如下代码进行截屏&#xff1a;UIWindow *screenWindow [[UIApplication sharedApplication] keyWindow]; UIGraphicsBeginImageContext(screenWindow.frame.size); [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *screenIm…

[python]---从java到python(02)---多线程,队列

多线程测试 #!/usr/bin/env python # -*- coding:utf-8 -*-import threading import timeclass A(threading.Thread):def __init__(self):# 初始化改线程threading.Thread.__init__(self)def run(self):# 该线程要执行的程序内容for i in range(3):print("我是线程A&quo…

将iOS默认上下文坐标系改变为Quartz通常坐标系

由于iOS的UIKit默认的坐标系的原点处于视图的左上角&#xff0c;而Quartz的通常坐标系中的原点位于左下角。当我们使用UIKit的坐标操作CGContextRef的时候&#xff0c;绘制出来的图片是上下颠倒的。因此我们在使用Qaurtz处理图形的时候&#xff0c;往往需要将坐标系转为与Quart…

[python]---从java到python(03)---爬虫

1.简单网页 #!/usr/bin/env python # -*- coding:utf-8 -*-import urllib.requestfile urllib.request.urlopen("https://www.jd.com") data file.read() # dataline file.readline() print(data)fhandle open("E:/python/1_1.html", "wb"…

iOS网络请求认证挑战

一、引言 Http请求中认证挑战相关的代理如下&#xff1a; 1.将要发送一个认证挑战的请求 - connection:willSendRequestForAuthenticationChallenge:2.是否能够对一个保护空间进行认证&#xff08;已废弃&#xff09;- connection:canAuthenticateAgainstProtectionSpace:3.…

大数据相关整理

1.hdfs 1.1.namenode 所有文件的读写入口&#xff0c;用来保存文件的元信息 元信息包括&#xff1a; fsimage文件&#xff1a;文件权限信息文件在block块的偏移量文件的位置信息 editlogs文件&#xff1a;对文件的写操作日志文件写日志指令&#xff0c;为了安全同步&#xf…

OC编码规范

一、命名规范 1.类: (1)首字母大写&#xff0c;后续单词首字母大写。 (2)类名末尾要包含此类的类型&#xff0c;比如RootView&#xff0c;RootViewController。 2.属性 (1)属性名称首字母小写&#xff0c;后续首字母大写; (2)使用property&#xff0c;要保持必要的空格&#xf…

数据库---mysql的索引和引擎

mysql 的索引和引擎 mysql的数据都是存放在磁盘上的&#xff0c;都说索引会使查询变快&#xff0c;那么肯定是索引用了特殊的数据结构。 常见的数据结构有&#xff1a; hash hash就是咱们在hashMap中的那个hash&#xff0c;用hash确实快&#xff0c;而且时间复杂度是O&#x…

SQLite内置表SQLITE_MASTER

一、概述1.SQLite数据库中有一个内置表&#xff0c;名为SQLITE_MASTER&#xff0c;此表中存储着当前数据库中所有表的相关信息&#xff0c;比如表的名称、用于创建此表的sql语句、索引、索引所属的表、创建索引的sql语句等。2.SQLITE_MASTER表示只读的&#xff0c;只能对他进行…

redis单线程为什么还快的个人解释

面试的时候&#xff0c; 面试官问&#xff0c;redis是单线程还是多线程 答&#xff1a;单线程 面试官再问&#xff0c;单线程&#xff0c;为什么还快呢&#xff1f;不应该是多线程才更快吗&#xff1f;那这是不是有什么矛盾啊&#xff1f; 答&#xff1a;啊&#xff1f;&#x…