今天我们的主题是相机(Camera)
,相信大家都用过,其实网上有很多文章已经写的很完备,但是本着众人说他千百遍,不如自己码一遍
的想法写了这篇文章。本文会很长,所以有基础的同学请自动过滤此篇文章。好了不再废话,开始我们今天的文章。
说到拍摄和录音我们需要用到AVFoundation
这个框架,首先我们来了解一下这个框架中和相机
有关的一些内容。
一、AVCapture的简单介绍
-
AVCaptuerDevice
:从字面上我们也可以了解到这是一个设备,而它也正是代表了iPhone或者iPad和相机有关的硬件。或许你还有点不了解,那么我们通过打印一段代码你就可以一目了然的了解到这是什么。
NSArray *captureDevices = [AVCaptureDevice devices];
NSLog(@"%@", captureDevices);
输出为:
2016-01-11 18:00:17.255 ZLCameraManagerDemo[2582:1107796] (
<AVCaptureFigVideoDevice: 0x16de5670 [Back Camera][com.apple.avfoundation.avcapturedevice.built-in_video:0]>,
<AVCaptureFigVideoDevice: 0x16ed0180 [Front Camera][com.apple.avfoundation.avcapturedevice.built-in_video:1]>,
<AVCaptureFigAudioDevice: 0x16dec640 [iPhone 麦克风][com.apple.avfoundation.avcapturedevice.built-in_audio:0]>,
)
我们可以看到打印为后置摄像头(Back Camera)
、前置摄像头(Front Camera)
和麦克风(iPhone 麦克风)
。
-
AVCaptureSession
:这是一个捕捉会话,那么它捕捉的是什么呢?我好像说了句废话。。。。因为摄像头无非能捕获相片、视频,而有声的视频明显包括音频。它的作用是将捕捉到的音视频会话
输出到硬件设备上也就是AVCaptureDevice
上。一个AVCaptureSession
是可以包含多个输入和多个输出的。但是session有且只能有一个,如果把音视频的拍摄当做一辆汽车的话,那么session更像是开车的人,负责汽车的启动与停止,打开各种设备与关闭。这么说大家应该对它拥有更透彻的了解。 -
AVCaptureInput
:它是一个抽象类,提供一个连接接口将捕获到的输入源链接到AVCaptureSession
上。既然是抽象类我们显然是无法直接使用的,所以我们只能用其子类AVCaptureDeviceInput
、AVCaptureScreenInput
和AVCaptureMetadataInput
来创建。-
AVCaptureDeviceInput
:使用该对象从AVCaptureDevice设备获取数据(用于获取摄像头拍摄的数据),该对象将会被添加给AVCaptureSession管理。 -
AVCaptureScreenInput
:使用该对象从屏幕获取数据(用于录制屏幕).该对象将会被添加给AVCaptureSeesion管理。 -
AVCaptureMetaDataInput
:获取元数据(很少使用)
-
-
AVCaptureVideoPreviewLayer
:视频预览层,其实可以把它想象成一个画布,我们通过摄像头拍摄到的画面就显示在这个画布上。AVCaptureVideoPreviewLayer 所呈现的画面是连续的,并非单张的静态影像,当然你也可以略过设定AVCaptureVideoPreviewLayer
的步骤,不显示摄影机所拍摄到的画面,这并不会有任何影响。它是CALayer
的子类,它可以实时查看拍照或视频录制效果,需要指定对应的 AVCaptureSession对象 -
AVCaptureOutput
:相对应于AVCaptureInput
,它也是一个抽象类,用来接收各种输出数据,为AVCaptureSession
提供一个输出目标接口。这么说或许有些抽象,其实它就是我们录制的视频或者拍摄的照片利用播放器或者相册打开时看到的图像。因其是抽象类,所以也是无法直接使用的,只能用其子类。- 输出数据为NSData
-
AVCaptureAudioDataOutput
:音频数据 -
AVCaptureStillImageOutput
:相片数据 -
AVCaptureVideoDataOutput
:录像数据
-
- 输出为AVCaptureFileOutput
-
AVCaptureAudioFileOutput
:音频文件,生成一个URL -
AVCaptureMovieFileOutput
:视频文件,生成一个URL
-
- 输出数据为NSData
二、基础使用
通过第一部分的介绍,我们应该对其各种重要的类有了一个初步的认识,那么下面,我们来看看基础使用。在此部分我们不关心检测设备是否可用的情况,只关心一些基础的使用,因为我封装了一个相机的manager,可以拍摄照片和录制图像,具体的请看封装的demo。
(一)AVCaptureSession
- 创建:
AVCaptureSession *session = [[AVCaptureSession alloc] init];
// 添加input和output
[session startRunning];
只有startRunning输入和输出才会真正添加到设备上,否则相当于给了一辆车而没有发动引擎,是无法运行起来的。 - sessionPreset:此属性是比较重要的一个属性,它决定了拍摄的照片或者图像的分辨率,我们最常使用的是640:480和1280:720,也就是我们通常说的4:3和16:9,例如添加分辨率为1280:720
if ([session canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
session.sessionPreset = AVCaptureSessionPreset1280x720;
} else {
// 失败之后的处理
}
- 重新设置session:
[session beginConfiguration];
// Remove an existing capture device.
// Add a new capture device.
// Reset the preset.
[session commitConfiguration];
(二)AVCaptureDevice
硬件设备都是一对一的,这决定了我们拍摄照片和录像需要建立视频的,录音就要建立音频的,所以其实是可以建立多个AVCaptureDevice的。
_videoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // 视频
_audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; //音频
因此部分是年前所写,现在有点断层,后续会在这两天想好之后补上
网友评论