如何使用AV Foundation从摄像头将视频帧捕获为图像?

英文原文地址:https://developer.apple.com/library/ios/qa/qa1702/_index.html#//apple_ref/doc/uid/DTS40010192


为了完成实时的捕获,首先初始化一个AVCaputureSession对象用于创建一个捕获会话(session),我们可以使用AVCaptureSession对象将AV输入设备的数据流以另一种形式转换到输出。

然后,我们初始化一个AVCaptureDeviceInput对象,以创建一个输入数据源,该数据源为捕获会话(session)提供视频数据,再调用addInput方法将创建的输入添加到AVCaptureSession对象。

接着初始化一个AVCaptureVideoDataOuput对象,以创建一个输出目标,然后调用addOutput方法将该对象添加到捕获会话中。

AVCaptureVideoDataOutput可用于处理从视频中捕获的未经压缩的帧。一个AVCaptureVideoDataOutput实例能处理许多其他多媒体API能处理的视频帧,你可以通过captureOutput:didOutputSampleBuffer:fromConnection:这个委托方法获取帧,使用setSampleBufferDelegate:queue:设置抽样缓存委托和将应用回调的队列。AVCaptureVideoDataOutputSampleBuffer对象的委托必须采用AVCaptureVideoDataOutputSampleBufferDelegate协议,使用sessionPreset协议来制定输出品质。

我们可以通过调用捕获会话的startRunning方法启动从输入到输出的数据流,通过stopRunning方法来停止数据流。

列表1给出了一个例子。setupCaptureSession创建了一个捕获会话,添加了一个视频输入提供提视频帧,一个输出目标获取捕获的帧,然后启动从输入到输出的数据流。当捕获会话正在运行时,使用captureOut:didOutputSampleBuffer:fromConnection方法将被捕获的视频抽样帧发送给抽样缓存委托,然后每个抽样缓存(CMSampleBufferRef)被转换成imageFromSampleBuffer中的一个UIImage对象。

---------------------------
列表1:使用AV Foundation设置一个捕获设备录制视频并将是视频帧保存为UIImage对象。

#import <AVFoundation/AVFoundation.h>

// 创建并配置一个捕获会话并且启用它
- (void)setupCaptureSession 
{
    NSError *error = nil;

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

    // 可以配置session以产生解析度较低的视频帧,如果你的处理算法能够应付(这种低解析度)。
    // 我们将选择的设备指定为中等质量。
    session.sessionPreset = AVCaptureSessionPresetMedium;

    // 找到一个合适的AVCaptureDevice
    AVCaptureDevice *device = [AVCaptureDevice
                             defaultDeviceWithMediaType:AVMediaTypeVideo];

    // 用device对象创建一个设备对象input,并将其添加到session
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device 
                                                                    error:&error];
    if (!input) {
        // 处理相应的错误
    }
    [session addInput:input];

    // 创建一个VideoDataOutput对象,将其添加到session
    AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];
    [session addOutput:output];

    // 配置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];


    // 如果你想将视频的帧数指定一个顶值, 例如15ps 
    // 可以设置minFrameDuration(该属性在iOS 5.0中弃用)
    output.minFrameDuration = CMTimeMake(1, 15);

    // 启动session以启动数据流
    [session startRunning];

    // 将session附给实例变量
    [self setSession:session];
}

// 抽样缓存写入时所调用的委托程序
- (void)captureOutput:(AVCaptureOutput *)captureOutput 
         didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
         fromConnection:(AVCaptureConnection *)connection

    // 通过抽样缓存数据创建一个UIImage对象
    UIImage *image = [self imageFromSampleBuffer:sampleBuffer];

     < 此处添加使用该image对象的代码 >

}

// 通过抽样缓存数据创建一个UIImage对象
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer 
{
    // 为媒体数据设置一个CMSampleBuffer的Core Video图像缓存对象
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    // 锁定pixel buffer的基地址
    CVPixelBufferLockBaseAddress(imageBuffer, 0); 

    // 得到pixel buffer的基地址
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); 

    // 得到pixel buffer的行字节数
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    // 得到pixel buffer的宽和高
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 

    // 创建一个依赖于设备的RGB颜色空间
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    // 用抽样缓存的数据创建一个位图格式的图形上下文(graphics context)对象
    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, 
      bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
    // 根据这个位图context中的像素数据创建一个Quartz image对象
    CGImageRef quartzImage = CGBitmapContextCreateImage(context); 
    // 解锁pixel buffer
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);

    // 释放context和颜色空间
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace);

    // 用Quartz image创建一个UIImage对象image
    UIImage *image = [UIImage imageWithCGImage:quartzImage];

    // 释放Quartz image对象
    CGImageRelease(quartzImage);

    return (image);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
Media Foundation(即媒体基金会)是一种供应用程序访问和操作多媒体数据的高级程序接口(API)。它允许开发人员在Windows操作系统上创建和处理音频、视频图像。而摄像头则是一种常用的外部设备,用来捕捉图像或录制视频。我们可以通过Media Foundation来控制摄像头,并将其捕捉到的图像视频数据保存为MP4格式。 要将摄像头保存为MP4格式,首先我们需要初始化Media Foundation,并检查计算机中是否存在摄像头设备。然后,我们通过Media Foundation的API调用来选择摄像头并打开它。接下来,我们可以设置视频和音频的编码格式,如分辨率、率、比特率等。然后,我们创建一个用于保存数据的MP4文件,并将摄像头的输出数据流导入到该文件中。 一旦设置完成,我们可以开始采集摄像头的数据。通过Media Foundation提供的API,我们可以不断获得最新的视频和音频样本。我们将这些数据写入到MP4文件中,以便保存摄像头的录制内容。在录制过程中,我们还可以进行必要的数据处理和编码操作,以改善视频和音频的质量。 最后,当我们完成摄像头的录制时,我们可以关闭摄像头设备和保存的MP4文件。我们可以继续使用Media Foundation的其他功能,如播放、编辑或转码等,来进一步处理保存的MP4文件。 总而言之,通过使用Media Foundation可以实现摄像头数据的捕捉和保存为MP4格式。这为我们提供了一个强大的工具,来开发各种多媒体应用程序和功能,提升用户体验和媒体处理的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值