如果译错,感谢指出。
英文原文地址: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); }
发表评论
-
iOS单元测试
2012-11-05 11:37 869转自:http://www.cnblogs.com/ke ... -
Core Data数据持久化的使用
2012-10-30 21:31 1006CoreData 是ios中用来对数据做持久化的一个框架 ... -
ASIHTTPRequest缓存策略的设置
2012-10-30 17:23 3829ASIHTTPRequest 是一款强大的网络请求框架,该框架 ... -
【无限互联】xcode自定义类的模板
2012-10-23 19:37 1111翻译:http://www.bobmccune.com/ ... -
【无限互联】适配iOS6和iPhone5屏幕
2012-10-23 18:05 24271. iOS6的mo模拟器比较大,通过comman ... -
【无限互联】mac下配置svn服务器
2012-10-22 13:30 729在mac下配置svn服务器其实很简单,只需要简单的几句命令就可 ... -
【无限互联】iOS开发之多线程开发
2012-10-10 17:41 1204本节要点: 1.多线程的概念 2.掌握iOS中多线程 ... -
【无限互联】iOS开发block用法之UIAlertView控件的修改
2012-10-10 17:06 2619原始的UIAlertView的需要通过委托方法来实现按钮 ... -
Objective-C新特性
2012-09-05 14:38 661基于Xcode4.4(不完全独有)。1. 成员方法无需前置声明 ... -
iphone-NSDate日期处理
2012-08-31 16:25 1025NSDate存储的是世界标准时(UTC),输出时需要 ... -
iphone开发资源汇总
2012-08-31 16:16 1564如何用Facebook graphic api上传视 ... -
iOS-如何让xcode自动检查内存泄露
2012-08-31 16:05 1055在project-setting中找到 “Run Static ... -
UIScrollView的属性总结
2012-02-08 15:58 4386在滚动过程当中,其实是在修改原点坐标 当手指触摸后, scr ... -
iPhone开发之 ARC是什么
2012-01-17 16:58 1331相关链接:http://blog.csdn ... -
画图时 自己做的一小笔记
2012-01-07 21:02 9230 CGContextRef context = UIGra ... -
让Xcode 4.2生成的app支持旧版iOS设备(armv6)
2012-01-07 00:46 1283这几天遇到一个非常奇怪的问题,基于Xcode 4.2开发的ap ... -
5个开源库的JSON解析速度测试
2011-12-03 23:15 1410iOS5新增了JSON解析的API ... -
获取iOS设备当前ip地址
2011-11-17 23:16 1338第一种方法是用系统api的方式获取,如下 #include & ... -
Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts)
2011-11-12 00:08 1396一个Graphics Context表示一 ... -
Quartz 2D编程指南(1) - 概览
2011-11-11 23:57 1652Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Ma ...
相关推荐
现在没有0分资源了,兑现不了诺言。本例主要是vb.net使用mediafoundation框架打开摄像头。包括同步异步两个方式。
用MEDIA FOUNDATion 抓取摄像头视频信息,也可以抓取音频信息,然后生成WMV视频文件,此代码部分参考微软提供资料
AV Foundation 开发秘籍,介绍iOS视听技术的一本入门书籍,字体还很清晰。
AVCam_AV Foundation录制电影和拍照 本资源使用AV Foundation架构实现录制、拍照功能
快速掌握使用AV Foundation开发iOS和OS X应用的技术如果想开发富媒体iOS或OS X应用程序,你可以使用苹果公司推出的AV Foundation框架来实现诸多神奇功能。不过AV Foundation框架基于最前沿的语言特征,极其庞大,...
基于Media foundation的视频采集例子,摄像头采集,做视频直播的可以参考。
Learning AV Foundation free chapters, great for learning AVFoundation
这个实例是一个media foundation 摄像头采集的例子, 是我从一个开源工程里抽出来的。加入画面旋转, 快照, 显示窗口切换的功能。还有最出彩的就是这个采集可以对任意视频硬件进行多实例采集,不受设备独点的...
使用Windows 的media foundation 抓取视频文件的缩列图并且显示的源代码
AV Foundation开发秘籍_实践掌握iOS & OS X应用的视听处理技术 源码 清华大学出版社
本资源用了一个文本简单的描述了Media Foundation的基本结构,另外还附上了一个基于win32的简单的程序演示了如何建立Media Foundation基本组件,同时附上了完整详细的注释在程序代码中,该代码在vs2010上编写的。
使用foundation5为基础创建的foundation后台管理模板
扫描完整版 AV Foundation开发秘籍 实践掌握iOS&OSX;应用的视听处理技
在 iOS 系统中,所有音频和视频播放及录制技术都源自 AV Foundation。通常情况下,应用程序可以使用媒体播放器框架(Media Player framework)实现音乐和电影播放功能。如果所需实现的功能不止于此,而媒体播放器框架...
这些样本的最初动机是试图找到一种方法,以通过RTP从编码为H264和/或VP8的网络摄像头流式传输音频和视频,然后在远程目标上进行渲染。 截至2020年1月,MFWebCamRtp样本已用于将H264样本从网络摄像头源流式传输到...
Foundation ISE使用方法Foundation ISE使用方法Foundation ISE使用方法
很多人安装tfs后,不会设置,给大家提供一个好的资源。Team foundation Server使用教程
MFC使用Media Foundation 播放媒体文件。主要使用IMFMediaSession下的几个API接口函数实现。源自msdn。
程序在win7系统,vs2010下编写,使用的技术有,多线程,gdi+,桌面窗口管理器。