自定义拍照或者录视频的功能,就需要用到AVFoundation框架,目前我只用到了拍照,所以记录下自定义拍照用法,视频用法等用上了再补充,应该是大同小异
 
以拍照过程为例,实现主要包括以下几个部分:
1,首先要判断用户授权:
let authorizationStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)
switch authorizationStatus {
        case.NotDetermined:
            AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted:  Bool) -> Void in
                if granted {
                    self.configureCamera()
                } else {
                    self.showErrorAlertView()
                }
            })
        case.Authorized:
            self.configureCamera()
        default:
            self.showErrorAlertView()
        }
 
2,AVCaptureInput
     AVCaptureInput是抽象出来拍照过程的输入端,这个可以是前置摄像头,后置摄像头或者麦克风
     需要通过 public init(device: AVCaptureDevice!) throws这个方法来初始化获得
而AVCaptureDevice 是苹果定义的捕获设备的抽象,用 public class func devicesWithMediaType(mediaType: String!) -> [AnyObject]! 方法来获得。
这个mediaType: String 又是定义在 AVMediaFormat.h.中的字符串,这里用到的是 AVMediaTypeVideo
 
3,AVCaptureOutput
AVCaptureOutput是抽象出来的拍照过程的输出端,可以是图片,视频,音频等,主要有:AVCaptureAudioDataOutput、AVCaptureAudioPreviewOutput、AVCaptureFileOutput、AVCaptureStillImageOutput、AVCaptureVideoDataOutput、AVCaptureAudioFileOutput、AVCaptureMovieFileOutput
其中AVCaptureFileOutput依然代表输出到文件的输出端,
这里用到的是AVCaptureStillImageOutput
 
4,AVCaptureSession
AVCaptureSession就是抽象出来的拍照过程,它需要一个输入:AVCaptureInput,一个输出:AVCaptureOutput,
 if session.canAddInput(cameraInput) {
                session.addInput(cameraInput)
 } 
 if session.canAddInput(cameraInput) {
                session.addInput(cameraInput)
 } 
 
然后调用session的startRunning方法,就开始捕获图像信息了,一般这里会用到AVCaptureVideoPreviewLayer,用来做图像的预览:
用session初始化previewLayer
previewLayer = AVCaptureVideoPreviewLayer(session: self.session)
然后设置layer的frame,把该layer添加到你想要显示预览的地方就可以了
 
5,在调用session的startRunning之前,还可以对相机进行聚焦,白平衡等设置
          if let tempDevice = self.currentCameraDevice {
                try tempDevice.lockForConfiguration()
                if tempDevice.hasFlash {
                    tempDevice.flashMode = self.flashMode
                }
                if tempDevice.isFocusModeSupported(.AutoFocus) {
                    tempDevice.focusMode = .AutoFocus
                }
                if tempDevice.isWhiteBalanceModeSupported(.AutoWhiteBalance) {
                    tempDevice.whiteBalanceMode = .AutoWhiteBalance
                }
                tempDevice.unlockForConfiguration()
               
            }
 
6,获取图片到指定设备
就是调用stillImageOutput的方法来获取图片,方法如下
let connection = self.stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)
        self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(connection) { [unowned self] (imageDataSampleBuffer: CMSampleBuffer!, error) -> Void in
            if error == nil {
                // 如果使用 session .Photo 预设,或者在设备输出设置中明确进行了设置,就能获得已经压缩为JPEG的数据
                let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)               
               // 样本缓冲区也包含元数据
               //let metadata:NSDictionary = CMCopyDictionaryOfAttachments(nil, imageDataSampleBuffer, CMAttachmentMode(kCMAttachmentMode_ShouldPropagate))!
                if let image = UIImage(data: imageData) {
                    //这个image就是获取到的拍照获得的image,这里可以保存到相册,或者修改,或者想干什么干什么
                    //注意这个image还是摄像头拍下来时的分辨率,并不是你设置的layer大小的,如果还需要剪裁,就剪裁之后在保存
                }
            } else {
                DLog("error while capturing still image: \(error)")
            }
           
        }

用AVFoundation自定义相机拍照的更多相关文章

  1. iOS开发笔记17:自定义相机拍照

    之前用AVFoundation自定义相机做了拍照与视频相关的东西,为什么要自定义呢?主要是提供更个性化的交互设计,符合app主题,对于视频来说,也便于提供更多丰富有趣的功能.前段时间整理了下拍照部分的 ...

  2. Android自定义相机拍照、图片裁剪的实现

    最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类似于小猿搜题.学霸君等app. 其实Android提 ...

  3. iOS开发--AVFoundation自定义相机

    首先导入一个头文件 #import <AVFoundation/AVFoundation.h> 由于后面我们需要将拍摄好的照片写入系统相册中,所以我们在这里还需要导入一个相册需要的头文件 ...

  4. Android自定义相机拍照并使用CardView展示

    直接上完整代码:在Android Studio新建一个项目,然后依次创建: 1.预先在drawable文件夹中保存的图片资源 2.创建:CameraPreView.java类: 3.创建:OnClic ...

  5. Android—实现自定义相机倒计时拍照

    这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的 ...

  6. 如何用uniapp+vue开发自定义相机插件——拍照+录像功能

    调用手机的相机功能并实现拍照和录像是很多APP与插件都必不可少的一个功能,今天智密科技就来分享一下如何基于uniapp + vue实现自定义相机界面,并且实现: 1: 自定义拍照 2: 自定义录像 3 ...

  7. swift3.0自定义相机界面

    这是公司上上上一个项目的自定义相机界面,原来是swift2.0写的,今天改为swift3.0,记录一下. 效果图如下:                                         ...

  8. Android相机使用(系统相机、自定义相机、大图片处理)

    本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人Surf ...

  9. Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52738492 前言:国庆节告一段 ...

随机推荐

  1. Spring MVC数据校验

    在web应用程序中,为了防止客户端传来的数据引发程序异常,常常需要对 数据进行验证.输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证则主要通过Jav ...

  2. swift 可选类型(optional)--- swift 入门

    一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print(&q ...

  3. 快速Android开发系列网络篇之Retrofit

    Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎 ...

  4. Java笔记——Java8特性之Lambda、方法引用和Streams

    Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...

  5. 【.net深呼吸】非 Web 项目使用缓存

    从.net 4 开始,非web项目也可以使用缓存技术,故曰:.net 4 乃框架成熟之标志也. 对于缓存嘛,耍过 ASP.NET 的伙伴们肯定知道,这么说吧,就是将一些使用频率较高的数据放于内存中,并 ...

  6. ElasticSearch 5学习(3)——单台服务器部署多个节点

    一般情况下单台服务器只会部署一个ElasticSearch node,但是在学习过程中,很多情况下会需要实现ElasticSearch的分布式效果,所以需要启动多个节点,但是学习开发环境(不想开多个虚 ...

  7. C#设计模式:单件(例)模式 -- 类也玩计划生育

    这里写的代码,相当于<Head First 设计模式>的读书笔记,原书是java的,自己在学习的过程中将其翻译为C#: (一)剖析经典的单件模式实现 单件模式 -- 确保一个类只有一个实例 ...

  8. SQLServer:什么是主键(PK)和外键(FK)?

    一.主键与外键 1.主键是用来唯一地标识一行数据.主键列必须包含唯一的值,且不能包含空值(null). 2.主键可以建立在每张二维表中单列或者多列上. 3.一张二维表上的外键可以引用另一张二维表上对应 ...

  9. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  10. 用SignalR 2.0开发客服系统[系列1:实现群发通讯]

    前言 交流群:195866844 先说一下我为什么会写这个博客吧,(首先说一下,我是一个小菜鸟,讲的不好请指导 - -,)  前段时间公司的项目涉及到在B/S上使用即时通讯,(其实就是做一个B/S的客 ...