用AVFoundation自定义相机拍照

自定义拍照或者录视频的功能,就需要用到AVFoundation框架,目前我只用到了拍照,所以记录下自定义拍照用法,视频用法等用上了再补充,应该是大同小异

demo在这里:https://github.com/Phelthas/TEST_XMLCommon

以拍照过程为例,实现主要包括以下几个部分:

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)")
            }

}

时间: 2024-10-16 05:39:31

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

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

之前用AVFoundation自定义相机做了拍照与视频相关的东西,为什么要自定义呢?主要是提供更个性化的交互设计,符合app主题,对于视频来说,也便于提供更多丰富有趣的功能.前段时间整理了下拍照部分的功能,主要分为以下五个部分 1.初始化,建立会话,获取摄像头 使用AVCaptureSessionPresetPhoto模式,输出的图片分辨率与系统相机输出的分辨率保持一致 添加后置摄像头与图片输出(默认采用后置摄像头拍摄) 2.嵌入实时预览层 获取实时预览画面,添加手势,初始化时默认在画面中心点对

使用AVFoundation 自定义相机和录制视频

先来了解几个重要的类 1.AVCaptureDevice:输入设备,包括摄像头和麦克风 2.AVCaptureSession:负责把AVCaptureDevice捕捉得到的视频或声音数据输出到输出设备中,需要为该对象添加输入设备和输出设备 3.AVCaptureDeviceInput:是AVCaptureInput的子类,使用该对象从AVCaptureDevice设备获取数据,该对象将会被添加给AVCaptureSession管理. 4.AVCaptureScreenInput:它是AVCapt

AVFoundation的自定义相机

最近由于工作项目的功能需求,需要用到AVFoundation来自定义相机的功能.所以花了点时间去研究了一下. 在网上可以找到很多实用AVFoundation的自定义相机自定义相机的博文,虽然功能的确是完成了,但是距离我的目标还是有不少的差距的. 首先声明,预览的照片是正方形的,拍摄结果最后得到的图片也是正方形的,再好多的博文上我都没有找到该怎么设置才可以得到正方形的图片. 我是首先拍一张照片,然后在使用图片裁剪的方式得到的正方行图片.好了,接下来就让我们开始吧. 首先要了解这几个类的用处 /**

自定义相机(二) -- 拍照

实现功能: 相机拍照,把图像保持到系统相册. 运行环境: 1.  XCODE 5.1.1 2.  真机(IPHONE5  ,  IOS6.1.4) #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> //导入 - "视频流" @interface MCViewController : UIViewController @property (strong, nonatomic) AVCaptu

自定义相机(三) -- 视频流数据 AND 预览 拍照 变焦

实现功能: 1. 视频流数据 2. 预览和拍照变焦, 所见即所得. 运行环境: 1.  XCODE 5.1.1 2.  真机(IPHONE5  ,  IOS6.1.4) #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> //导入 - "视频流" @interface MCViewController : UIViewController<AVCaptureVideoDataOutpu

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

这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的秒数的 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" androi

【Android】自定义相机的实现(支持连续拍照、前后摄像头切换、连续对焦)

~转载请注明http://blog.csdn.net/u013015161/article/details/46921257 介绍 这几天,写了一个自定义照相机的demo,支持连续拍照和摄像头切换.由于自己以前没接触过相关的编程,也算是一个学习的过程,在这里做一下记录,同时也分享出来,并附上源码和工程. 效果如图: 左上角switch切换摄像头,右边snap按钮进行拍照. 一般流程 Android进行拍照,需要调用摄像头类android.hardware.Camera.而要进行预览,则需要用an

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

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52738492 前言:国庆节告一段落,又是新一月,上月主要是围绕MediaPlayer相关展开,从今天开始,开始分析多媒体框架中的Camera模块,看下今天的Agenda: Camera拍照 Camera录像 新API android.hardware.camera2 新旧API特点对比 Camera自定义相机 新API andro

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需