关于AVCaptureDevice的理解

AVCaptureDevice 主要是用来获取手机相机的属性
使用的时候必须引用AVFoundation.framework包,导入头文件
当要生成二维码时,需要对 info.plist文件中添加相应的key和value
关于AVCaptureDevice的理解_第1张图片
也可右键点击以 Source Code形式打开,添加如下:

<key>NSPhotoLibraryUsageDescriptionkey>
<string>请点击“允许”以允许访问。string>
<key>NSCameraUsageDescriptionkey>
<string>请点击“允许”以允许访问。string>
<key>NSAppleMusicUsageDescriptionkey>
<string>请点击“允许”以允许访问。string>
<key>NSMicrophoneUsageDescriptionkey>
        <string>请点击“允许”以允许访问。string>

权限的说明
关于AVCaptureDevice的理解_第2张图片
部分属性的理解

1.前置和后置摄像头
typedef NS_ENUM(NSInteger, AVCaptureDevicePosition) {
AVCaptureDevicePositionUnspecified = 0,
AVCaptureDevicePositionBack = 1,
AVCaptureDevicePositionFront = 2
} NS_AVAILABLE(10_7, 4_0);

2.闪光灯开关
typedef NS_ENUM(NSInteger, AVCaptureFlashMode) {
AVCaptureFlashModeOff = 0,
AVCaptureFlashModeOn = 1,
AVCaptureFlashModeAuto = 2
} NS_AVAILABLE(10_7, 4_0);

3.手电筒开关–其实就是相机的闪光灯
typedef NS_ENUM(NSInteger, AVCaptureTorchMode) {
AVCaptureTorchModeOff = 0,
AVCaptureTorchModeOn = 1,
AVCaptureTorchModeAuto = 2,
} NS_AVAILABLE(10_7, 4_0);

4.焦距模式调整
typedef NS_ENUM(NSInteger, AVCaptureFocusMode) {
AVCaptureFocusModeLocked = 0,
AVCaptureFocusModeAutoFocus = 1,
AVCaptureFocusModeContinuousAutoFocus = 2,
} NS_AVAILABLE(10_7, 4_0);

5.曝光量调节
typedef NS_ENUM(NSInteger, AVCaptureExposureMode) {
AVCaptureExposureModeLocked = 0,
AVCaptureExposureModeAutoExpose = 1,
AVCaptureExposureModeContinuousAutoExposure = 2,
AVCaptureExposureModeCustom NS_ENUM_AVAILABLE_IOS(8_0) = 3,
} NS_AVAILABLE(10_7, 4_0);

6.白平衡
typedef NS_ENUM(NSInteger, AVCaptureWhiteBalanceMode) {
AVCaptureWhiteBalanceModeLocked = 0,
AVCaptureWhiteBalanceModeAutoWhiteBalance = 1,
AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance = 2,
} NS_AVAILABLE(10_7, 4_0);

7.距离调整
typedef NS_ENUM(NSInteger, AVCaptureAutoFocusRangeRestriction) {
AVCaptureAutoFocusRangeRestrictionNone = 0,
AVCaptureAutoFocusRangeRestrictionNear = 1,
AVCaptureAutoFocusRangeRestrictionFar = 2,
} NS_AVAILABLE_IOS(7_0);

存在的几个对象的理解

AVCaptureDevice //硬件设备
AVCaptureInput //输入的设备
AVCaptureOutput //输出的数据
AVCaotureSession //协助input和output的数据传输

关系:
有很多Device的input和很多类型的Output,都通过一个CaptureSession来控制进行传输,即:CaputureDevice适配AVCaptureInput,通过Session来输入到AVCaptureOutput中,这样就达到了从设备到文件等持久传输的目的(如从相机设备采集图像到UIImage中)

那么如果视频输入(input)和对应的视频输出(output),音频对应音频,因而需要建立对应的Connections(连接),来各自连接它们,这个连接对象是由AVCaptureSession持有的,这个对象为 AVCaptureConnection,可以控制input和output的数据传输(通过各种的input port,都可以获取到相应的数据)

Session使用模式

AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session startRunning];

需要创建一个session,发running消息,响应,就把输入设备的东西,提交到输出设备中。

如果想在一个已经使用session中(已经startRunning)更换新的device,删除旧的,方法

[session beginConfiguration];
[session commitConfiguration];

AVCaptureDevice的理解

Device是对硬件的一对一的表示,一个AVCaptureDevice对象,对应一个实际的硬件设备
/* 创建并配置输入设备 */

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if (device==nil) {
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"设备没有摄像头" preferredStyle:UIAlertControllerStyleAlert];
        [alert addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        }]];
        [self presentViewController:alert animated:YES completion:nil];
        return;
    }
    // Device
    _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    // Input
    _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

然后添加input到session的模式(检查是否可添加)

// Session 添加输入输出设备前要判断该手机(设备)能否添加输入输出设备。
    _session = [[AVCaptureSession alloc]init];
    [_session setSessionPreset:AVCaptureSessionPresetHigh];
    if ([_session canAddInput:self.input])
    {
        [_session addInput:self.input];
    }

    if ([_session canAddOutput:self.output])
    {
        [_session addOutput:self.output];
    }

Output的使用

ios中,分为MovieFile(输出成movie文件)、VideoData(适用各个Frame的处理)、AudioData(声音采集)、StillImage(静态图像拍照)几种output,它们都继承与AVCaptureOutput

你可能感兴趣的:(关于AVCaptureDevice的理解)