在AROverlayExample project中我说明了如何捕捉视频直播中的静止图像。这可能是最简单的使用AVCaptureSession输出方法,所以我基于AROverlayExample创建了一个新的工程,使用scan按钮来捕捉一个image,并把image保存在设备的相册中。

可以在这里获取AROverlayImageCapture的源码here

下面是AROverlayExample的指导。如果你不熟悉,可以先阅读我上一张的内容来明白将要做什么。我使用的是Xcode4.0。

添加Frameworks

首先要做的是,添加一些frameworks到工程中。在Build Phases中的Link Binary With Libraries中,添加ImageIO, CoreMedia and CoreVideo framework到target中。

修改CaptureManager

在CaptureManager.h中,加入如下的代码:

#define kImageCapturedSuccessfully @"imageCapturedSuccessfully"
.
.
.
@property (retain) AVCaptureStillImageOutput *stillImageOutput;
@property (nonatomic, retain) UIImage *stillImage;- (void)addStillImageOutput;
- (void)captureStillImage;

第一个属性是AVCaptureStillImageOutput,正如其名称暗示的那样,它需要捕捉静态图像。一旦捕捉到图像UIImage将会引用它。

在CaptureManager.m的顶部导入ImageIO框架:

#import <ImageIO/ImageIO.h>

记得要synthesize两个新的属性,并在dealloc方法中释放它们,并置为nil。然后添加如下的两个方法:

- (void)addStillImageOutput
{[self setStillImageOutput:[[[AVCaptureStillImageOutput alloc] init] autorelease]];NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil];[[self stillImageOutput] setOutputSettings:outputSettings];AVCaptureConnection *videoConnection = nil;for (AVCaptureConnection *connection in [[self stillImageOutput] connections]) {for (AVCaptureInputPort *port in [connection inputPorts]) {if ([[port mediaType] isEqual:AVMediaTypeVideo] ) {videoConnection = connection;break;}}if (videoConnection) { break; }}[[self captureSession] addOutput:[self stillImageOutput]];
}- (void)captureStillImage
{  AVCaptureConnection *videoConnection = nil;for (AVCaptureConnection *connection in [[self stillImageOutput] connections]) {for (AVCaptureInputPort *port in [connection inputPorts]) {if ([[port mediaType] isEqual:AVMediaTypeVideo]) {videoConnection = connection;break;}}if (videoConnection) { break; }}NSLog(@"about to request a capture from: %@", [self stillImageOutput]);[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL);if (exifAttachments) {NSLog(@"attachements: %@", exifAttachments);} else { NSLog(@"no attachments");}NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];    UIImage *image = [[UIImage alloc] initWithData:imageData];[self setStillImage:image];[image release];[[NSNotificationCenter defaultCenter] postNotificationName:kImageCapturedSuccessfully object:nil];}];
}

第一个方法只是通过让您指定输出设置,准备静止图片输出。这些设置对于当前的示例应用程序是符合的,你也可以设置其他的选项。

第二个方法捕获实时视频视图的静止图像,并把图像保存到stillImage属性。然后,它抛出一个图像被捕获的通知,我们将在AVOverlayViewController中,监听这个通知。

修改 AVOverlayViewController

在AVOverlayViewController.m中加入一些东西。首先声明一个私有的方法:

@interface AROverlayViewController ()
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
@end

在文件中加入如下的两个方法:

- (void)saveImageToPhotoAlbum
{UIImageWriteToSavedPhotosAlbum([[self captureManager] stillImage], self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{if (error != NULL) {UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Image couldn't be saved" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];[alert show];[alert release];}else {[[self scanningLabel] setHidden:YES];}
}

第一个方法是保存捕获的图像到相册,第二个方法是图像保存后的回调。我已经修改过工程,这样的话当图像被保存,scanning标签将会显示"Saveing",当保存完毕时label将会被影藏。当然会有一些检查错误的判断。

现在,需要把这些东西合在一起。首先初始化stillImageOutput:

[[self captureManager] addStillImageOutput];

在viewDidLoad中,添加一个观察者来观察图像被捕获的通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveImageToPhotoAlbum) name:kImageCapturedSuccessfully object:nil];

最后,改变按钮的方法:

- (void)scanButtonPressed {[[self scanningLabel] setHidden:NO];<span style="white-space:pre">   </span>[[self captureManager] captureStillImage];
}

现在可以运行app,按下scan按钮,将会捕获视频流,并保存在你的相册中。

iOS Still Image Capture Using AVCaptureSession(使用AVCaptureSession获取静止Image)相关推荐

  1. IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)

    IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题) 参考文章: (1)IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题) (2)https:// ...

  2. # iOS 相册图片多选以及类似微信获取相册图片并使用AFN框架上传至服务器

    iOS 相册图片多选以及类似微信获取相册图片并使用AFN框架上传至服务器 做APP基本上都是需要从系统的相册当中获取一张或多张图片.那怎么做呢?下面我就带你来实现这个内容,第一次写. 我只是记录一下. ...

  3. ios 设备获取idfa_超4成用户选择升级iOS 14,35%苹果设备已无法获取IDFA

    最近,AppsFlyer发布了<2020中国应用全球化趋势洞察报告>,并在其中着重提到了和苹果iOS紧密相关的一些信息,包括iOS 14的推出以及由此引发的IDFA政策变更等等. 2020 ...

  4. IOS零碎技术整理(3)-获取wifi列表

    1.   该功能实现基于MobileApple80211框架来进行开发,而目前该框架成为了私有框架,其中的API均为私有API. 如果使用这些API可能导致应用不能上app store或者ios版本升 ...

  5. iOS利用HealthKit框架从健康app中获取步数信息

    微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为 ...

  6. ios 区分iphone ipod ipad的方法及获取设备名称。

    coding如何区分iphone ipod & ipad 的几种方法 UI_USER_INTERFACE_IDIOM Returns the interface idiom supported ...

  7. iOS第三方登录之Twitter(登录,获取用户信息)含demo

    一.  登录twitter和创建应用 1.打开twitter的官网https://dev.twitter.com,如果还没有注册账号的,需要先注册账号,已经注册账号的,请先登录. 2.选择,My ap ...

  8. ios android cpu占用率,iPhone-iOS-从应用程序获取CPU使用率

    iPhone-iOS-从应用程序获取CPU使用率 有谁知道如何获取应用程序的CPU使用率? 绝对有可能,因为应用商店中有一些可以显示它的应用程序(活动监视器触摸). 3个解决方案 74 votes 更 ...

  9. python ios 坐标点击_python点击鼠标获取坐标(Graphics)

    使用Python进行图像编程,要使用到Graphics库.下面列举出较常用的代码 from graphics import * #设置画布窗口名和尺寸 win = GraphWin('hehe', 6 ...

最新文章

  1. 《LeetCode力扣练习》第14题 C语言版 (做出来就行,别问我效率。。。。)
  2. Poptset学员之牛奶咖啡糖
  3. 2.2.5 NIO.2 Path 和 Java 已有的 File 类
  4. B. 熟练剖分(tree) (概率DP)
  5. java cookie的有效期_Java Web cookie的有效期
  6. Azkaban实战,Command类型单一job示例,任务中执行外部shell脚本,Command类型多job工作flow,HDFS操作任务,MapReduce任务,HIVE任务
  7. Gym - 100989J -(DFS)
  8. c#copyto_String.CopyTo()方法以及C#中的示例
  9. 程序开发,面试恐惧症_如何克服恐惧并停止讨厌的工作面试
  10. [转载] python中list的方法有哪些_Python 列表(list)中的方法
  11. 关于ASP.NET给产品分类,分页,详情页生成静态页面
  12. nodepad++通过正则表达式,删除带有特殊字符的某一行
  13. 扎克伯格为提高员工工作效率,亲自做了这 26 张 PPT ,值得收藏
  14. OpenCV-图像处理(21、霍夫圆变换)
  15. JVM内存模型及String对象内存分配
  16. Qt连接MySql驱动加载失败问题解决方法
  17. 一、数据库之理论基础
  18. NSIS对卸载程序的签名
  19. MySQL函数 NOW()
  20. 老款Tplink路由器如何桥接

热门文章

  1. 程序员的创世传说 第六节 棚户区的怪人
  2. 计算机文化(20版)答案
  3. 手机端抓包http/https-Fiddler的设置
  4. 网络安全——sql注入判断
  5. Schrodinger软件学习计算机辅助药物设计——基本操作以及分子对接
  6. ABP (.Net Core) 使用MySQL数据库
  7. JAVA基础-06.集合-15.【Map】
  8. 【Matlab DVRP】蚁群算法求解带距离的车辆路径规划问题【含源码 1040期】
  9. 洛谷 P1255 数楼梯(dp + 高精度)
  10. 如何让自己的浏览器全屏?