视频知识

OC之输入管理AVCaptureInput

2018-09-10  本文已影响0人  苏沫离

1、管理数据输入的抽象类 AVCaptureInput

AVCaptureInput 继承 NSObject,是向 AVCaptureSession 提供输入数据的对象的抽象超类。

要将 AVCaptureInput 对象与会话 AVCaptureSession 关联,需要 AVCaptureSession实例调用 -addInput: 方法。

AVCaptureInput对象具有一个或多个端口(AVCaptureInputPort的实例),每个端口对应于它们可以生成的每个数据流。 例如,呈现一个视频数据流的AVCaptureDevice对象具有一个端口。

@property(nonatomic, readonly) NSArray<AVCaptureInputPort *> *ports;

捕获输入的端口集。当该端口的formatDescription发生更改时,每个AVCaptureInputPort实例都会发送AVCaptureInputPortFormatDescriptionDidChangeNotification 通知。

1.1、输入端口 AVCaptureInputPort

AVCaptureInputPort 捕获输入提供的特定数据流。

属性 类型 描述
enabled BOOL 指示端口是否已启用,默认为YES。如果要仅捕获AVCaptureInput对象提供的媒体流的子集,请使用此属性有选择地禁用流。
input AVCaptureInput 拥有该端口的输入对象
mediaType AVMediaType 端口的媒体类型
clock CMClockRef 表示AVCaptureDevice自己的时钟的对象。返回的CMClockRef对象是只读的,可能无法反映AVCaptureDevice中的实际时钟。
formatDescription CMFormatDescriptionRef 返回的对象描述了端口当前提供的媒体格式。
NSString *const AVCaptureInputPortFormatDescriptionDidChangeNotification;

如果AVCaptureInputPortformattcription属性的值更改,则发送该通知。

1.2、媒体类型AVMediaType

媒体类型AVMediaType是使用typedef修饰的标识符,提供各种媒体类型:

描述
AVMediaTypeVideo 指定视频
AVMediaTypeAudio 指定音频
AVMediaTypeText 指定文本
AVMediaTypeClosedCaption 指定闭路内容
AVMediaTypeSubtitle 指定字幕
AVMediaTypeTimecode 指定一个时间代码
AVMediaTypeMetadata 指定元数据
AVMediaTypeMuxed 指定mux媒体
AVMediaTypeMetadataObject
AVMediaTypeDepthData
1.3、子类

由于 AVCaptureInput 是个抽象类,无法直接使用,所以我们一般使用它的子类类管理输入数据。我们常用的AVCaptureInput的子类有三个:

AVCaptureInput继承关系.png

2、AVCaptureDeviceInput

AVCaptureDeviceInput AVCaptureDeviceInputAVCaptureInput的一个具体子类,用于从AVCaptureDevice对象捕获数据传递给AVCaptureSession

2.1、创建AVCaptureDeviceInput

我们可以使用类方法或者实例方法通过指定的 AVCaptureDevice 初始化 AVCaptureDeviceInput

- (instancetype)initWithDevice:(AVCaptureDevice *)device error:(NSError * _Nullable *)outError;
+ (instancetype)deviceInputWithDevice:(AVCaptureDevice *)device error:(NSError * _Nullable *)outError;
2.2、访问设备 AVCaptureDevice
@property(nonatomic, readonly) AVCaptureDevice *device;

与输入相关联的设备。

2.3、设置AVCaptureDeviceInput属性
@property(nonatomic) BOOL unifiedAutoExposureDefaultsEnabled;

指示自动曝光默认值是否统一的布尔值。如果是,自动曝光默认值是统一的。如果没有(默认),应用程序的自动曝光行为将被保留。
如果手动设置minFrameRatemaxFrameRatemaxExposureDuration,则无论此属性的设置如何,自定义值都将覆盖设备默认值。

//使用AVMediaTypeVideo 指明AVCaptureDevice代表视频,默认使用后置摄像头进行初始化
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *videoInputError = nil;
AVCaptureDeviceInput *videoInput = [[AVCaptureDeviceInput alloc]initWithDevice:device error:&videoInputError];
if (videoInputError){
    NSLog(@"videoInputError == %@",videoInputError);
}
else{
    AVCaptureSession *session = [[AVCaptureSession alloc]init];
    if ([session canAddInput:videoInput]){
        [session addInput:videoInput];            
    }
}

3、AVCaptureScreenInput

AVCaptureScreenInputAVCaptureInput的具体子类,用于从macOS中的屏幕录制的捕获输入。

AVCaptureScreenInput实例是 AVCaptureSession 对象的输入源,AVCaptureSession对象从连接到系统的其中一个屏幕提供媒体数据,由CGDirectDisplayIDs表示。

3.1、初始化捕获屏幕输入
- (instancetype)initWithDisplayID:(CGDirectDisplayID)displayID;

该方法初始化AVCaptureScreenInput,并提供来自指定显示的媒体数据。

- (instancetype)init;
+ (instancetype)new;

创建AVCaptureScreenInput,从主屏幕提供媒体数据。使用这两个方法等效于使用CGMainDisplayID()函数获取CGDirectDisplayID传递给-initWithDisplayID:方法。

3.2、一些设置
属性 类型 描述
minFrameDuration CMTime 屏幕输入的最小帧持续时间。使用此属性来请求输入生成视频帧的最大帧速率。由于总带宽,所请求的速率可能无法实现,因此实际帧速率可能较低。
cropRect CGRect 指示要捕获的屏幕区域的边界矩形(以像素为单位)。默认情况下,AVCaptureScreenInput捕获与其关联的displayID的整个区域。原点(0,0)是屏幕的左下角。
scaleFactor CGRect 指示从屏幕捕获的视频缓冲区的缩放系数。默认情况下,AVCaptureScreenInput以 1.0 的比例因子(无缩放)从显示器捕获视频缓冲区。设置此属性以按给定因子缩放缓冲区; 例如,scaleFactor为 2.0 的 320x240 捕获区域产生 640x480 的视频缓冲区。
capturesCursor BOOL 指定鼠标光标是否出现在捕获的输出中。当此属性为true(默认值)时,捕获的视频帧包括鼠标指针。如果将此属性更改为false,则捕获的输出仅包含屏幕上的窗口(即,捕获的视频中鼠标指针不可见)。
capturesMouseClicks BOOL 指定鼠标单击是否在捕获的输出中突出显示。默认情况下,AVCaptureScreenInput不会突出显示其捕获的输出中的鼠标单击。如果将此属性设置为YES,则会在捕获的输出中突出显示鼠标单击(在单击的持续时间内围绕鼠标绘制圆圈)。
AVCaptureScreenInput *screenInput = [[AVCaptureScreenInput alloc] initWithDisplayID:CGMainDisplayID()];
AVCaptureSession *session = [[AVCaptureSession alloc]init];
if ([session canAddInput:screenInput]){
    [session addInput:screenInput];
}

4、AVCaptureMetadataInput

AVCaptureMetadataInputAVCaptureInput的具体子类,用于向AVCaptureSession提供定时元数据的捕获输入。

4.1、创建 AVCaptureMetadataInput
- (instancetype)initWithFormatDescription:(CMMetadataFormatDescriptionRef)desc
clock:(CMClockRef)clock;
+ (instancetype)metadataInputWithFormatDescription:(CMMetadataFormatDescriptionRef)desc
clock:(CMClockRef)clock;

创建捕获元数据输入,以便为AVCaptureSession提供定时组。有两个参数:

4.2、提供元数据
- (BOOL)appendTimedMetadataGroup:(AVTimedMetadataGroup *)metadata
error:(NSError * _Nullable *)outError;

AVCaptureSession提供元数据。

上一篇 下一篇

猜你喜欢

热点阅读