美文网首页视频知识
OC之输入管理AVCaptureInput

OC之输入管理AVCaptureInput

作者: 苏沫离 | 来源:发表于2018-09-10 11:13 被阅读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
    • 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
    • 返回值:指示组是否已成功附加。

    相关文章

      网友评论

        本文标题:OC之输入管理AVCaptureInput

        本文链接:https://www.haomeiwen.com/subject/mqajgftx.html