自定义拍照或者录视频的功能,就需要用到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. OpenWrt中开启usb存储和samba服务

    在从官网安装的WNDR3800 15.05.1版本OpenWrt中, 不带usb存储支持以及samba, 需要另外安装 1. 启用usb支持 USB Basic Support https://wik ...

  2. ASP.NET Core 在 JSON 文件中配置依赖注入

    前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等 ...

  3. Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

  4. ASP.NET MVC 描述类型(二)

    ASP.NET MVC 描述类型(二) 前言 上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor ...

  5. xamarin开发UWP元素的初始化设置顺序

    在开发xamarin的UWP平台不可避免的遇到一下坑,现记录下来,希望对后面踩坑有帮助. 一.listview的分组问题:当我们使用listview的IsGroupingEnabled=true时,如 ...

  6. AngularJs之四(作用域)

    一:angulaJs的作用域scope Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带.scope 是一个 JavaScript 对象,带有属性和方 ...

  7. Android Toolbar 开发总结

    初识 Toolbar Toolbar是在 Android 5.0 开始推出的一个 Material Design 风格的导航控件 ,Google 非常推荐大家使用 Toolbar 来作为Android ...

  8. 严重: Null component localEngine:type=JspMonitor,name=jsp,WebModule=//localhost/SpringMVC01,J2EEApplication=none,J2EEServer=none

    检查了 Java Build Path, Java Compiler,Project Facts 都确定了版本一致 包括 maven run as →run config 里面的 jdk 和maven ...

  9. 06.GitHub实战系列~6.过滤器过滤掉的文件如何上传

    比如我想发布一个软件版本供普通人下载: Git库建立了VS的过滤规则后 dll 和 exe 是自动过滤的,这时候我们得加参数(看图)git add xxx -f

  10. Tcl internal variables

    Tcl internal variables eryar@163.com 在Tcl中内置了一些变量,并赋予了一定的功能.内置变量列表如下: 变量名称 功能描述 argc 指命令行参数的个数. argv ...