使用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

[BL1]Session: 会议

[BL2]设备获取数据

[BL3]用于录制屏幕动作

[BL4]代表输出到文件的输出端

[BL5]输出到音频文件的输出端

[BL6]输出到电影文件的输出端

iOS-----AVFoundation框架的功能详解的更多相关文章

  1. Flask框架 之 功能详解

    浏览目录 配置文件 路由系统 视图 请求相关 响应 模板渲染 session 闪现 中间件 蓝图(blueprint) 特殊装饰器 配置文件 知识点 给你一个路径 “settings.Foo”,可以找 ...

  2. Flask框架之功能详解

    1|0浏览目录 配置文件 路由系统 视图 请求相关 响应 模板渲染 session 闪现 中间件 蓝图(blueprint) 特殊装饰器 1|1配置文件 知识点 给你一个路径 "settin ...

  3. VideoPipe可视化视频结构化框架新增功能详解(2022-11-4)

    VideoPipe从国庆节上线源代码到现在经历过了一个月时间,期间吸引了若干小伙伴的参与,现将本阶段新增内容总结如下,有兴趣的朋友可以加微信拉群交流. 项目地址:https://github.com/ ...

  4. 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

    原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...

  5. iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例

     iOS之UI--使用SWRevealViewController 实现侧边菜单功能详解实例 使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWReveal ...

  6. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例

    使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现   2.纯代 ...

  7. .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】

    SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ...

  8. iOS 视图控制器转场详解

    iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...

  9. iOS中MVC等设计模式详解

    iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...

随机推荐

  1. swoole 异步队列简明教程

    安装步骤如下(推荐把安装文件下载到 /usr/local/src 目录下): step 1: wget --no-check-certificate https://github.com/swoole ...

  2. Vmware 设置桥接模式

    在搭建VMware虚拟机的时候要配置网络 可以看到一共主要就3种 1.桥接模式(Bridge) 虚拟系统的IP可设置成与本机系统在同一网段,虚拟系统相当于网络内的一台.独立的机器,与本机共同插在一个H ...

  3. SaltStack部署服务及配置管理apache+php-第二篇

    实验目标 1.使用SaltStack部署apache和php, 2.使用salt管理httpd.conf配置文件配置访问info.php使用账户密码 3.在salt里面增加对conf.d目录进行配置管 ...

  4. 生信实验室收集---Dana Pe'er Lab

    Dana Pe'er Lab of Computational Systems Biology Dana Pe'er是哥伦比亚大学生物科学系的副教授,被认为是计算系统生物学的主要研究人员之一.Dana ...

  5. contos LINUX搭建LAMP笔记

    LINUX搭建LAMP笔记 .YUM:Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于R ...

  6. webservice获取天气信息

    效果 1.eclipse中新建一个Java项目 2.通过命名获取天气的客户端信息 首先,打开天气网站http://ws.webxml.com.cn/WebServices/WeatherWS.asmx ...

  7. 转载:poj题目分类(侵删)

    转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码)  ...

  8. codeforces Round#429 (Div2)

    2017-08-20 10:00:37 writer:pprp 用头文件#include <bits/stdc++.h>很方便 A. Generous Kefa codeforces 84 ...

  9. 编译binutil包报错 error: array type has incomplete element type extern const struct relax_type md_relax_table[];

    安装lfs时编译binutils出错: ../../sources/binutils-2.15.91.0.2/gas/config/tc-i386.h:457:32: error: array typ ...

  10. Dll Hijacker

    #coding=utf-8 # # Dll Hijacker # # platform: Python 2.x @ Windows # # author:Coca1ne import os,sys,t ...