iOS-----AVFoundation框架的功能详解
使用AVFoundation拍照和录制视频
需要开发自定义的拍照和录制视频功能,可借助于AVFoundation框架来实现,该框架提供了大量的类来完成拍照和录制视频.主要使用如下类:
AVCaptureDevice:该对象代表物理输入设备,包括摄像头和麦克风.开发者可通过该对象来配置底层物理设备的属性.需要指出的是,
我们不能直接创建该类的实例,只能通过该类的devices、defaultDeviceWithMediaType:(NSString *)mediaType、
devicesWithMediaType:(NSString *)mediaType方法来获取对应的输入设备数组,接下来即可获取前置摄像头、后置摄像头或麦克风,
程序就可设置该对象的对焦模式、闪光灯模式、曝光补偿、白平衡等各种拍照相关属性。
注意:
在配置摄像头的相关属性之前,必须先调用lockForConfiguration:方法执行锁定,配置完成后调用unlockForConfiguration方法解锁。
AVCaptureSession:该对象负责把AVCaptureDevice捕捉得到的视频或声音数据输出到输出设备中.不管执行实时的还是离线的录制,开发者都必须创建AVCaptureSession对象,并为该对象添加输入设备(负责捕捉数据)和输出端(负责接收数据).例如如下代码片段
| 代 码 片 段 |  | 
AVCaptureDeviceInput[BL2] :它是AVCaptureInput的子类,使用该对象从AVCaptureDevice设备获取数据,该对象将会被添加给AVCaptureSession管理.
AVCaptureScreenInput[BL3] :它是AVCaptureInput的子类,使用该对象从屏幕获取数据(用于录制屏幕动作).该对象将会被添加给AVCaptureSeesion管理
AVCaptureAudioDataOutput、AVCaptureAudioPreviewOutput、AVCaptureFileOutput[BL4] 、AVCaptureStillImageOutput、AVCaptureVideoDataOutput:它们都是AVCaptureOutput的子类,用于接收各种数据.该对象也会被添加给AVCaptureSession管理.其中AVCaptureFileOutput依然代表输出到文件的输出端,
AVCaptureAudioFileOutput[BL5] 、AVCaptureMovieFileOutput[BL6] :它们都是AVCaptureFileOutput的子类,分别代表输出到音频文件、电影文件的输出端。
AVCaptureVideoPreviewLayer:该对象是CALayer的子类,开发者只要创建它的实例,并为它设置AVCaptureSession,就可以非常方便地用它来实现拍摄预览.
| 代 码 片 段 |  | 
使用AVFoundation实现拍照和录制视频的大致步骤如下
| 1 | 使用AVCaptureDevice的静态方法获取设备,包括摄像头和麦克风都可通过这种方式来获取 | 
| 2 | 利用AVCaptureDevice初始化AVCaptureDeviceInput对象,无论摄像头还是麦克风都可通过这种方式转换为AVCaptureInput对象 | 
| 3 | 初始化输出端.如果只是拍照,则初始化AVCaptureStillImageOutput输出端即可;如果要捕捉视频,则初始化AVCaptureMovieFileOutput输出端. | 
| 4 | 创建AVCaptureSession对象,使用该对象来添加输入设备和输出端.调用AVCaptureSession的startRunning方法开始捕捉画面或声音数据. | 
| 5 | 将捕捉的数据(照片、视频数据)输出到指定文件。 | 
| 框架 | AVFoundation.framework框架,AssetsLibrary.framework,CoreMedia.framework框架 | 
使用AVFoundation生成视频缩略图
AVFoundation可用来生成视频缩略图.
AVFoundation生成视频缩略图主要靠如下两个类.
| AVURLAsset | 该类是AVAsset的子类,AVAsset类专门用于获取多媒体的相关信息,包括获取多媒体的画面、声音等信息。而AVURLAsset子类的作用则是根据NSURL来初始化AVAsset对象。 | 
| AVAssetImageGenerator[BL7] | 该类专门用于截取视频指定帧的画面。 | 
使用AVFoundation生成视频缩略图的步骤如下:
| 1 | 根据视频的NSURL创建AVURLAsset对象 | 
| 2 | 根据AVURLAsset对象创建AVAssetImageGenerator对象 | 
| 3 | 调用AVAssetImageGenerator对象的copyCGImageAtTime:actualTime:error:方法来获取该视频指定时间点的视频截图.该方法的第一个CMTime参数用于指定获取哪个时间点的视频截图,第2个CMTime参数用于获取实际截图 位于哪个时间点. 其中CMTime是专门用于标识电影时间的结构体,通常用如下两个函数来创建CMTime. CMTimeMake(int64_t value, int_32 timescale): 第1个参数代表获取第几帧的截图,第2个参数代表每秒的帧数.因此实际截取的时间点是value/timescale. CMTimeMakeWithSeconds(Float64 seconds, int32_t preferredTimeScale): 第1个参数代表获取第几秒的截图,第2个参数则代表每秒的帧数. | 
| 代码片段 | // 为增加UIImage增加一个类别,通过在该类别中为UIImage增加一个imageWithVideo:方法来获取视频的缩略图 
// UIImage + Video.m
@implementation UIImage (Video)
+ (UIImage *)imageWithVideo:(NSURL *)vidoURL
{
  // 根据视频的URL创建AVURLAsset
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
// 根据AVURLAsset创建AVAssetImageGenerator对象
 AVAssetImageGenerator* gen = [[AVAssetImageGenerator alloc] initWithAsset: asset];
 gen.appliesPreferredTrackTransform = YES;
 // 定义获取0帧处的视频截图
CMTime time = CMTimeMake(, );
 NSError *error = nil;
CMTime actualTime;
// 获取time处的视频截图
CGImageRef  image = [gen  copyCGImageAtTime: time actualTime: &actualTime error:&error];
// 将CGImageRef转换为UIImage
UIImage *thumb = [[UIImage alloc] initWithCGImage: image];
CGImageRelease(image);
return  thumb;
}
@end
ViewController.m
@interface ViewController: UIViewController
@property (nonatomic, strong) UIImageView *iv;
@end
@implementation ViewController
- (void)viewDidLoad
{
   [super viewDidLoad];
  // 获取URL
   NSURL *videoUrl = [[NSBundle mainBundle]
URLForResource:@”movie” withExtension:@”mp4”];
   // 生成视频的缩略图
   UIImage *image = [UIImage imageWithVideo:videoUrl];
   self.iv.image = image;
}
@end | 
iOS-----AVFoundation框架的功能详解的更多相关文章
- Flask框架 之 功能详解
		浏览目录 配置文件 路由系统 视图 请求相关 响应 模板渲染 session 闪现 中间件 蓝图(blueprint) 特殊装饰器 配置文件 知识点 给你一个路径 “settings.Foo”,可以找 ... 
- Flask框架之功能详解
		1|0浏览目录 配置文件 路由系统 视图 请求相关 响应 模板渲染 session 闪现 中间件 蓝图(blueprint) 特殊装饰器 1|1配置文件 知识点 给你一个路径 "settin ... 
- VideoPipe可视化视频结构化框架新增功能详解(2022-11-4)
		VideoPipe从国庆节上线源代码到现在经历过了一个月时间,期间吸引了若干小伙伴的参与,现将本阶段新增内容总结如下,有兴趣的朋友可以加微信拉群交流. 项目地址:https://github.com/ ... 
- 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )
		原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ... 
- iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例
		iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例 使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWReveal ... 
- iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例
		使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现 2.纯代 ... 
- .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】
		SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ... 
- iOS 视图控制器转场详解
		iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ... 
- iOS中MVC等设计模式详解
		iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ... 
随机推荐
- mysql慢查询和php-fpm慢日志
			MySQL慢查询 在web开发中,我们经常会写出一些SQL语句,一条糟糕的SQL语句可能让你的整个程序都非常慢,超过10秒一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较长的SQL语句 ... 
- kill me heal me的链接
			bilibili上的链接被和谐了,坑爹 韩剧网可以看,不过貌似不太清晰 http://www.hanjuwang.com/play/2015/1851.html 池城治愈营 http://www.bi ... 
- Mybatis中使用自定义的类型处理器处理枚举enum类型
			知识点:在使用Mybatis的框架中,使用自定义的类型处理器处理枚举enum类型 应用:利用枚举类,处理字段有限,可以用状态码,代替的字段,本实例,给员工状态字段设置了一个枚举类 状态码,直接赋值给对 ... 
- DataStage系列教程 (Slowly Changing Dimension)缓慢变化维
			BI中维表的增量更新一般有2种: Type 1:覆盖更改.记录的列值发生变化,直接update成最新记录. Type 2:历史跟踪更改.记录值发生变化,将该记录置为失效,再insert一条新的记录. ... 
- MU puzzle
			2017-08-06 20:49:38 writer:pprp 三种操作: 1.MUI -> MUIUI 2.MUUU -> MU 3.MUIII -> MUU 分析:有两个操作:将 ... 
- python2.7.10  VS2015编译方法
			打开 Python-2.7.10\PCbuild目录 然后设置只编译python和pythoncore: 好了,编译试一试. 出现了好几个错误.由于 VS2015 取消了 timezone 的定义,改 ... 
- Python在线教程(廖雪峰)
			http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000 
- 在activity之间通过静态变量传递数据
			在activity之间通过静态变量传递数据 一.简介 主要作用:解决intent不能传递非序列化的对象 评价:简单方便,但是容易发生内存泄露,所以要及时回收内存 二.具体操作 1.在传输数据的页面弄好 ... 
- hdu1540线段树连续区间
			模板题>.<当初学了一波又忘了 #include<map> #include<set> #include<cmath> #include<queu ... 
- MySQL相关错误汇总
			Eroor 1 描述: 在启动mysql的时候出现如下问题:"ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' ... 
