OC之输入管理AVCaptureInput
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;
如果AVCaptureInputPort
的formattcription
属性的值更改,则发送该通知。
1.2、媒体类型AVMediaType
媒体类型AVMediaType是使用typedef
修饰的标识符,提供各种媒体类型:
值 | 描述 |
---|---|
AVMediaTypeVideo |
指定视频 |
AVMediaTypeAudio |
指定音频 |
AVMediaTypeText |
指定文本 |
AVMediaTypeClosedCaption |
指定闭路内容 |
AVMediaTypeSubtitle |
指定字幕 |
AVMediaTypeTimecode |
指定一个时间代码 |
AVMediaTypeMetadata |
指定元数据 |
AVMediaTypeMuxed |
指定mux媒体 |
AVMediaTypeMetadataObject |
|
AVMediaTypeDepthData |
1.3、子类
由于 AVCaptureInput
是个抽象类,无法直接使用,所以我们一般使用它的子类类管理输入数据。我们常用的AVCaptureInput
的子类有三个:
![](https://img.haomeiwen.com/i7112462/e15a13a96f319cff.png)
-
AVCaptureDeviceInput
:用于从AVCaptureDevice
对象捕获数据。 -
AVCaptureScreenInput
:从macOS屏幕上录制的一种捕获输入。 -
AVCaptureMetadataInput
:它为AVCaptureSession
提供AVMetadataItems
。AVCaptureMetadataInputs
呈现了一个且只有一个AVCaptureInputPort
,它目前可能只连接到AVCaptureMovieFileOutput
。通过输入端口提供的元数据由客户机提供,并且必须符合客户机提供的CMFormatDescription
。AVMetadataItems
在AVTimedMetadataGroup
中提供。
2、AVCaptureDeviceInput
AVCaptureDeviceInput AVCaptureDeviceInput
是AVCaptureInput
的一个具体子类,用于从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;
指示自动曝光默认值是否统一的布尔值。如果是,自动曝光默认值是统一的。如果没有(默认),应用程序的自动曝光行为将被保留。
如果手动设置minFrameRate
、maxFrameRate
或maxExposureDuration
,则无论此属性的设置如何,自定义值都将覆盖设备默认值。
//使用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
AVCaptureScreenInput 是AVCaptureInput
的具体子类,用于从macOS中的屏幕录制的捕获输入。
AVCaptureScreenInput
实例是 AVCaptureSession
对象的输入源,AVCaptureSession
对象从连接到系统的其中一个屏幕提供媒体数据,由CGDirectDisplayIDs
表示。
3.1、初始化捕获屏幕输入
- (instancetype)initWithDisplayID:(CGDirectDisplayID)displayID;
该方法初始化AVCaptureScreenInput
,并提供来自指定显示的媒体数据。
- 参数
displayID
: 从中捕获视频的显示ID。 - 返回值:初始化捕获屏幕输入以提供来自给定显示器的媒体数据。如果无法使用显示例如:它在系统上不可用,则返回nil。
- (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
AVCaptureMetadataInput 是AVCaptureInput
的具体子类,用于向AVCaptureSession
提供定时元数据的捕获输入。
4.1、创建 AVCaptureMetadataInput
- (instancetype)initWithFormatDescription:(CMMetadataFormatDescriptionRef)desc
clock:(CMClockRef)clock;
+ (instancetype)metadataInputWithFormatDescription:(CMMetadataFormatDescriptionRef)desc
clock:(CMClockRef)clock;
创建捕获元数据输入,以便为AVCaptureSession
提供定时组。有两个参数:
- 参数:
desc
: 用于定义客户端提供的元数据。如果传递NULL
,则抛出异常NSInvalidArgumentException
。 - 参数:
clock
:为提供的样本提供时基。如果传递NULL
,则抛出异常NSInvalidArgumentException
。
4.2、提供元数据
- (BOOL)appendTimedMetadataGroup:(AVTimedMetadataGroup *)metadata
error:(NSError * _Nullable *)outError;
为AVCaptureSession
提供元数据。
- 参数
metadata
:定时的元数据组。要表示没有元数据的句点,传递一个空的AVTimedMetadataGroup
。 - 返回值:指示组是否已成功附加。