文档章节

基于iOS8以上版本的AV Foundation框架特性之--AVCaptureDevice

海二少
 海二少
发布于 2017/08/23 16:55
字数 2615
阅读 10
收藏 0
AV Foundation框架介绍了一系列用于支持iOS8.0及以上版本的API。新特性包括Focus Pixels、光学图像防抖动功能、1080p60、慢动作视频、影院级视频防抖动功能, 单镜头(视频)HDR 以及视频录制过程中拍摄高分辨率静态照片。

除此之外, 还支持手动控制功能(包括手动对焦、手动曝光、曝光补偿、手动白平衡以及托架性静态捕捉)。这些特性可参考 WWDC 2014 Session 508 Camera Capture: Manual Controls.

Focus Pixels自动对焦
光学图像防抖动
1080p60
240 fps慢动作视频 
影院级视频防抖动功能 
单镜头(视频) HDR
视频录制过程中拍摄高分辨率静态照片 
文档修订记录
Focus Pixels自动对焦
iPhone6 和iPhone6 Plus专用的Focus Pixels 技术可通过相位检测来提供深度信息。 连续自动对焦变化非常快速和敏感。 当镜头做全焦点扫描时可达到完全没有震颤效果。相位检测非常好,推荐你在录制视频的同时允许自动对焦。在光线不好的情况下,AF机制可通过扫描来收集对比信息。 

如果硬件支持Focus Pixels ,那么当你设置 AVCaptureDevice focusMode 的属性值为AVCaptureFocusModeContinuousAutoFocus时,这个功能是默认"开启"的。因此当自动对焦可用时,它们会自动调用,无需手动选择开启或关闭。iPhone6 和iPhone 6 Plus的前置摄像头都有一个固定的聚焦透镜,因此Focus pixels自动对焦仅仅是针对于后置摄像头而言的。所有的针对后置摄像头的AVCaptureDeviceFormat对象都支持除了720p240格式的自动对焦。

您怎么知道某个格式是使用了Focus pixels,还是使用了传统的反差式对焦,或者根本不支持任何对焦呢?

AVCaptureDeviceFormat的只读属性autoFocusSystem可以解决这个问题。AVCaptureAutoFocusSystem 有3个常量:None、ContrastDetection以及PhaseDetection。当使用的格式支持相位检测时,强烈推荐你允许相机在录制时能够连续调整焦点,因为相位检测非常快速且敏锐。当系统使用传统反差检测时,应该在录制前锁定对焦,或者在支持的前提下使用AVCaptureDevice的smoothAutofocusEnabled属性。

注意:使用传统的对比检测自动对焦功能时,当对焦时,AVCaptureDevice的adjustingFocus属性会变为YES,而且当完成对焦后这个属性就会变为NO。当相位检测自动对焦正在使用时,adjustingFocus属性不转为YES,因为相位检测往往会更频繁地对焦,但它几乎让你感觉不到它频繁对焦了。可以利用AVCaptureDevice lensPosition 属性来观察由相位检测AF引起的透镜移动变化。

请查看AVCaptureDevice.h-AVCaptureAutoFocusSystem和autoFocusSystem.

光学图像防抖动功能

iPhone 6 Plus(只限6 Plus)的后置摄像头支持光学图像防抖动功能。默认配置中,该功能会在低光线情况下,在你使用8百万像素设备格式的AVCaptureStillImageOutput拍照时激活或者预先调整AVCaptureSessionPresetPhoto时激活。 在iOS7中,AV Foundation 使用了相同的属性AVCaptureStillImageOutput automaticallyEnablesStillImageStabilizationWhenAvailable。这个属性在所支持的平台上(iPhone 5s、iPhone 6以及iPhone 6 Plus)默认为YES。在iPhone 5s 和iPhone 6 上,数字图像防抖动技术可减少低光线图片的模糊强度。在iPhone6 Plus上,数字和光学图像防抖动技术的结合可以在光线度更低的情况下达到更好的效果。

请查看AVCaptureOutput.h - automaticallyEnablesStillImageStabilizationWhenAvailable.

1080p60

iphone6和iPhone6 Plus的后置摄像头有一个1080p30的AVCaptureDeviceFormat (420v / 420f) 和一个支持1080p60的格式。它可以从最小2 fps 的帧速率增加到最大60 fps帧速率。AVCaptureSessionPresetHigh使用的是1080p30 格式。如果你想用1080p60 来记录,请使用iOS7中的 AVCaptureDevice formats,找到你想使用的AVCaptureDeviceFormat,设置AVCaptureDevice setActiveFormat属性值,而不是AVCaptureSession setSessionPreset。可回顾下WWDC 2013 Session 610 视频"What's New in Camera Capture" 来学习这项技术。请查看AVCaptureDevice.h - activeFormat.

240 fps的慢动作视频

iphone6和iPhone6 Plus的后置摄像头有一个720p30的AVCaptureDeviceFormat (420v / 420f) 和一个支持720p240的格式。它支持的帧速率范围为5 fps - 240 fps。你可以通过设置AVCaptureDevice activeFormat的属性值来设置它(同上面的1080p60一样)。240 fps 格式已被放弃了。如果你想在iPhone 6 或iPhone 6 Plus上抓取120 fps格式的图像,找到和选择支持 240fps 的格式,然后设置AVCaptureDevice activeVideoMinFrameDuration 和activeVideoMaxFrameDuration 属性为CMTimeMake( 1, 120 ).

请查看AVCaptureDevice.h - activeFormat.

影院级视频防抖动功能

iOS 6在iPhone 4S上引入了支持视频防抖动的API。iPhone 6和6 Plus的后置摄像头支持一个更积极的、更令人激动的和更流畅的算法--"影院级视频防抖动功能"。相比较普通的视频防抖动特性,该防抖动特性减少了相机视角,引入了更多视频抓取延迟,并且消耗了更多系统内存。因此这个功能不是默认的,必须设置后使用。

当使用影院级视频防抖动功能时,强烈推荐使用相近的的或者相同的最小帧和最大帧持续时间来保持延迟的一致性和可控性。 iPhone 6 and 6 Plus也支持早期产品中使用的一般视频防抖动算法。照先前说的,AVCaptureConnection允许你调用AVCaptureConnection setEnablesVideoStabililzationWhenAvailable:方法来选择视频防抖功能。AV Foundation现在支持不止一种形式的视频防抖动功能,因此旧方法(AVCaptureConnection videoStabilizationEnabled:)已经被弃用了,现在更推荐使用AVCaptureConnection setPreferredVideoStabilizationMode:方法。

有4种视频防抖动模式常数供你选择,AVCaptureVideoStabilizationModeOff、AVCaptureVideoStabilizationModeStandard、AVCaptureVideoStabilizationModeCinematic以及AVCaptureVideoStabilizationModeAuto。

通过调用AVCaptureDeviceFormat isVideoStabilizationModeSupported:方法,你可以查询AVCaptureDevice activeFormat属性来决定支持哪一种防抖模式。设置除了AVCaptureVideoStabilizationModeOff以外的其他参数都不会强制使视频防抖动功能打开。因为一些设备的格式和AVCaptureOutput's 不支持防抖动功能。要想决定实际使用哪一个视频防抖动模式,你可以键值观察其AVCaptureConnection activeVideoStabilizationMode属性。当你将首选视频防抖动模式参数为AVCaptureVideoStabilizationModeAuto时,将会基于你使用的格式和帧速率选择一个适当的防抖模式。现在只有1080p30 和 1080p60 视频格式支持影院级视频防抖动功能。默认的preferredVideoStabilizationMode值是

AVCaptureVideoStabilizationModeOff。在早期的设备上,只有16:9视频格式支持防抖动。

请查看AVCaptureDevice.h-isVideoStabilizationModeSupported: 和AVCaptureSession.h -preferredVideoStabilizationMode 和activeVideoStabilizationMode.

单镜头(视频) HDR

又叫"流HDR"或者"视频HDR"。iPhone 6 and 6 Plus 支持连续的、流状高动态范围视频,不同于传统的方法通过将静态图片和不同的EV值熔合来构建成一张高动态范围的图片。HDR支持是嵌入在传感器里的。该功能在API里被称为"视频HDR"。所有前置摄像头的AVCaptureDeviceFormat对象都支持视频HDR。在后置摄像头上,540p30、720p30、1080p30以及1080p60格式支持视频HDR。

默认情况下,AVCaptureDevice(AVCaptureDevice automaticallyAdjustsVideoHDREnabled属性默认是YES)会自动调整视频HDR。当自动调整视频HDR开启时,在你使用setActiveFormat:设置一个新的格式时,AVCaptureDevice会始终关掉videoHDREnabled属性。相反如果你调用setSessionPreset:方法,AVCaptureDevice会根据视频HDR是否符合预设情况来自动开启或关闭视频HDR。

如果你想要在某个指定的格式下迫使视频HDR开启,请将automaticallyAdjustsVideoHDREnabled属性设置为NO, 然后将AVCaptureDevice videoHDREnabled属性设置为YES。你可能会不允许设置后面的那个属性当你第一次关闭视频HDR自动调整功能。注意,设置videoHDREnabled属性可能会引起AVCaptureDevice的一个冗长的重新配置过程,类似于设置一个新的有效格式或AVCaptureSession sessionPreset属性。如果你要设定有效格式或者AVCaptureSession的会话预设和videoHDREnabled,你应该把这些操作括在[session beginConfiguration]和[session commitConfiguration]里来最小化重新配置时间。

请参看AVCaptureDevice.h-automaticallyAdjustsVideoHDREnabled和videoHDREnabled。

视频录制过程中拍摄高分辨率静态照片

在所有的设备上,AVCaptureStillImageOutput根据AVCaptureDeviceD activeFormat指定的分辨率来捕捉静态图片。换句话说,如果你的activeFormat CMVideoFormatDescription是640x480的分辨率,那么捕捉到的静态图片就是640x480。有时因为AVCaptureVideoDataOutput密集的图片处理,AVCaptureDevice需要在压缩分辨率的情况下运行,但是还是希望在不影响预览和重置设备的情况下抓取全分辨率的静态图片。

基于iPhone 6和6 Plus的新特性,你可以在录制activeFormat指定分辨率视频(视频数据输出和影片文件输出)的同时抓取高分辨率的静态图片。该高分辨率静态图片仍然保持AVCaptureDevice's activeFormat设定的屏幕高宽比和视角。这个功能默认情况下是关闭的,不过你可以通过调用AVCaptureStillImageOutput setHighResolutionStillImageOutputEnabled:方法开启它。你也可以通过查询AVCaptureDeviceFormat highResolutionStillImageDimensions属性来得到捕捉的静态图片的分辨率。 当这个功能开启时你可以采集视频,比如录制192x144的视频同时抓取3264x2448(全8兆像素)的静态图片。注意,如果你允许对于所有的输出都要保持视频防抖动,那么AVCaptureStillImageOutput输出的高分辨率静态图片会小个10%或更多。 视频录制过程中的高分辨率静态图片功能只在后置摄像头上支持。

作为参考,以下列出了支持iPhone 6和iPhone 6 Plus的前置和后置摄像头的AVCaptureDeviceFormat

TABLE KEY  (图片 1, 图片 2)

HRSI = 高分辨率静态图片量度

FOV = 视角

VIS = 支持视频防抖动的格式

Max Zoom = 最大视频变焦因子

Upscales = 在某一个数字高标度时使用的变焦因子

AF = 自动对焦系统(1 = 对比检测, 2 = 相位检测)

ISO = 支持的ISO范围 

SS = 支持的曝光持续范围

HDR = 这个格式支持视频HDR

Figure 1  支持后置摄像头AVCaptureDeviceFormat项目


Figure 2  Supported AVCaptureDeviceFormat's for the back camera.

 

© 著作权归作者所有

海二少
粉丝 0
博文 87
码字总数 48854
作品 0
程序员
私信 提问
JellyBean Camera Service 4.1.2和4.2.1两版本变化

4.2 CameraService的部分代码,和4.1的版本的区别还是比较大的,具体变化多大还没来得及分析.先从他们的代码布局变化看起吧 AndroidJellyBean4.1.2 Camera Service代码布局: frameworks/av/se...

Jerikc
2013/03/09
628
0
「对抗深度强化学习」是如何解决自动驾驶汽车系统中的「安全性」问题的?...

原文来源:arXiv 作者:Aidin Ferdowsi、 Ursula Challita、Walid Saad、Narayan B. Mandayam 「雷克世界」编译:嗯~是阿童木呀、KABUDA 对于自动驾驶汽车(AV)而言,要想在未来的智能交通系...

cf2suds8x8f0v
2018/05/08
0
0
FFmpeg 是如何实现多态的?

前言 众所周知,FFmpeg 在解码的时候,无论输入文件是 MP4 文件还是 FLV 文件,或者其它文件格式,都能正确解封装、解码,而代码不需要针对不同的格式做出任何改变,这是面向对象中很常见的多...

shzwork
03/11
17
0
AV Linux 2018.6.25 发布,基于 Debian 的视听制作系统

AV Linux 2018.6.25 已发布。该版本带来了已升级至 4.16 版本的 Linux 内核,并改进了对新版本的 AMD 显卡的支持。另外最重要的改进是修复了关于引导系统 UEFI 方面的问题。 官方发布说明显示...

局长
2018/07/02
773
2
AV Linux 6.0.4 发布,包括重要安全更新

AV Linux 6.0.4 发布,此版本包括重要的安全更新,强烈建议用户升级到最新版本,通过新的 live DVD 镜像升级。还有一个方案是使用新的更新程序脚本来更新现有的 AV Linux 6.0.2 和 6.0.3 系统...

oschina
2014/11/07
1K
19

没有更多内容

加载失败,请刷新页面

加载更多

矩阵中的路径

判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向上下左右移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路...

Garphy
2分钟前
1
0
Hibernate 5 Maven 仓库的 Artifacts

Hibernate artifacts 官方发布的仓库在 JBoss Maven repository 中。Hibernate 发布的 artifacts 也会同时同步到 Maven Central 仓库中,这是一个自动同步进程(可能会有一些延迟)。 Hibern...

honeymoose
50分钟前
4
0
如何学习uni-app?

uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架。 开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS、Android、微信小程序、H5等多个平台,保证其正确运行并达到优秀体验。 <templ...

达叔小生
54分钟前
5
0
OSChina 周一乱弹 —— 后来马云就一心想挣钱了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑:《空帆船》- 朴树 《空帆船》- 朴树 手机党少年们想听歌,请使劲儿戳(这里) @webw :第二次被锁在电梯里了 上次你忘带电梯卡, ...

小小编辑
今天
738
11
关于does not give a valid preprocessing token

#define VFUNC(self) ((##self##)->_vptr) 这样在gcc下会编译失败, VC不会 报pasting ) does not give a valid preprocessing token 据说是因为版本问题 解法:去掉## define VFUNC(self) (......

shzwork
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部