美文网首页
高级捕捉功能

高级捕捉功能

作者: 浪呀么浪打浪 | 来源:发表于2020-07-24 11:11 被阅读0次

    一、视频缩放

    iOS7之前,通过AVCaptureConnection的videoScaleAndCropFactor属性对摄像头缩放进行了有限制的支持。可以调整连接缩放的值从默认的1.0增加到videoMaxScaleAndCropFactor属性定义的最大值。这一功能在特定的场景下很有用,不过具有明显的限制。第一点:videoScaleAndCropFactor是一个连接级的设置,意思是要想在用户界面正确获取他的状态值,必须对AVCaptureVideoPreviewLayer应用一个正确的缩放变换。这是一个额外的工作量,并且当应用高缩放因子进行变换时会导致预览层的图片质量变低。第二点也是最大的限制,videoScaleAndCropFactor只能在AVCaptureStillImageOutput连接中设置,这就让视频捕捉类应用程序无法利用这一特性。

    iOS7之后,可以直接对AVCaptureDevice对象使用缩放参数,这意味着所有会话的输出,包括预览层,都会自动响应这一设置的状态。AVCaptureDevice提供了videoZoomFactor的属性,用于控制捕捉设备的缩放等级。这个属性的最小值为1.0,即不能进行图片的缩放。最大值由捕捉设备的activeFormat值确定,它是新类型AVCaptureDeviceFormat的一个实例,这个类定义了活动捕捉格式功能的细节,其中就包括videoMaxZoomFactor。

    设备进行缩放效果是通过居中裁剪由摄像头传感器捕捉到的图片实现,当设置了一个低缩放因子时,一般低于1.5,图片等于或大于输出尺寸,这就在不用放大的情况下进行了一个适度的缩放,图片质量会得以全部保存。在哪个点开始放大图像由AVCaptureDeviceFormat的videoZoomFactorUpscaleThreshold值确定。

    确定最大缩放因子,需要定义一个合理的缩放范围。不希望将内容缩放至videoMaxZoomFactor,因为太大就不实用了。不过在计算最大值时,要时刻留意该值。如果设置缩放因子超过最大值就会出现问题。

    videoZoomFactor属性会立即调整缩放级别,这对一些连续性的控制比较有效,例如滑动条;不过,希望在一个时间段内将缩放数值从一个值逐渐调整为另一个值,rampToVideoZoomFactor这个方法就非常合适。

    二、人脸检测

    使用iOS的内置相机时,会注意到视图中有新的人脸进入时会自动建立相应的焦点。一个黄色矩形框会显示在新检测到的人脸位置,并以矩形的中点完成自动对焦。

    苹果首次向开发者提供的人脸检测是在Core Image框架中给出的。Core Image框架定义了CIDetector和CIFaceFeature两个对象,它们使用起来非常简单但提供了强大的人脸检测功能。不过这些方法并没有对实时性进行优化,导致在现代摄像头和视频程序要求的帧率下很难应用。

    iOS6中,通过一个特定的AVCaptureOutput类型AVCaptureMetadataOutput可以实现上述功能。它输出的是元数据,这个元数据来自于一个AVMetadataObject抽象类的形式,该类定义了用来处理多种元数据类型的接口。当使用人脸检测时,会输出一个具体的子类类型AVMetadataFaceObject.

    AVMetadataFaceObject实例定义了许多个用于描述被检测到人脸的属性,最重要的属性就是人脸的边界(bounds)。还给出了用于定义人脸斜倾角和偏转角的参数。斜倾角(roll angle)表示人的头部向肩膀方向的倾斜角度,偏转角(yaw angle)表示人脸绕y轴旋转的角度。

    当配置AVCaptureMetadataOutput对象时,重要的一点是要通过设置metadataObjectTypes属性指定对象输出的元数据类型。限制检测到的元数据类型集合的做法是一种优化处理方法,可以减少我们实际感兴趣的对象数量。AVFoundation支持多种元数据类型。

    setMetadataObjectsDelegate:(nullable id<AVCaptureMetadataOutputObjectsDelegate>)objectsDelegate queue:(nullable dispatch_queue_t)objectsCallbackQueue

    由于人脸检测用到硬件加速,而且许多重要任务都在主线程中执行,所以需要为这个参数指定主队列。

    三、使用高帧率捕捉

    捕捉:框架支持60FPS帧率捕捉720p视频,并带有视频稳定技术。此外可以支持启用droppable-P-frames的h.264,保证高帧率内容可以在旧设备上流畅播放。

    播放:AVPlayer 支持以多种播放帧率播放资源内容,不过AVPlayerItem给出了一个显著的音频处理过程的优化,即在降低播放率的时候如何控制音频内容的播放。AVPlayerItem有audioTimePitchAlgorithm属性,可以为降低或加速播放率设置算法。

    编辑:框架的编辑功能为可变组合中执行缩放编辑提供全面支持。

    导出:AVFoundation提供了保存原始帧率的功能,所以高FPS内容可以被导出或进行帧率转换,这样就可以保证所有的内容都以标准的30FPS进行输出。

    AVCaptureDeviceFormat的formats属性得到设备所有支持的格式。

    AVCaptureDeviceFormat具有videoSupportedFrameRateRanges属性,他包含了一个AVFrameRateRange对象数组,其中带有格式所支持的最小帧率、最大帧率和时长信息。使用高帧率捕捉的一个秘诀就是找到设备的最高质量格式,找到它相关的帧时长,之后手动设置捕捉设备的格式和帧时长。

    将最小帧时长和最大帧时长设置为AVFrameRateRange定义的值。AVFoundation通常处理帧时长数据,使用CMTime实例而不是帧率。minFrameDuration值为maxFrameRate的倒数值。比如帧率为60FPS,则duration为1/60秒。

    四、视频处理

    当需要使用底层控制时,就会用到框架提供的最底层的视频捕捉输出AVCaptureVideoDataOutput 。AVCaptureVideoDataOutput是一个AVCaptureOutput子类。可直接访问摄像头传感器捕捉到的视频帧。这是一个强大的功能,这样控制了视频数据的格式、时间和元数据,可以按照需求操作视频内容。

    AVCaptureVideoDataOutput输出的对象需要AVCaptureVideoDataOutputSampleBufferDelegate协议包含视频数据。

    AVCaptureVideoDataOutputSampleBufferDelegate定义了两个方法:

    - (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection:每当有一个新的视频帧写入时该方法就会被调用。数据会基于视频数据输出的videoSettings属性进行解码或重新编码。

    - (void)captureOutput:(AVCaptureOutput *)output didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection:每当一个迟到的视频帧被丢弃时就会调用该方法。通常是因为在didOutputSampleBuffer调用中消耗了太多处理时间就会调用该方法。开发者应该尽量提高处理效率,否则将收不到缓存数据。

    相关文章

      网友评论

          本文标题:高级捕捉功能

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