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;

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

1.2、媒体类型AVMediaType

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

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

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

AVCaptureInput继承关系.png
  • AVCaptureDeviceInput:用于从AVCaptureDevice对象捕获数据。
  • AVCaptureScreenInput:从macOS屏幕上录制的一种捕获输入。
  • AVCaptureMetadataInput:它为AVCaptureSession提供AVMetadataItemsAVCaptureMetadataInputs呈现了一个且只有一个AVCaptureInputPort,它目前可能只连接到AVCaptureMovieFileOutput。通过输入端口提供的元数据由客户机提供,并且必须符合客户机提供的CMFormatDescriptionAVMetadataItemsAVTimedMetadataGroup中提供。

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,并提供来自指定显示的媒体数据。

  • 参数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

AVCaptureMetadataInputAVCaptureInput的具体子类,用于向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
  • 返回值:指示组是否已成功附加。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容