大多数浏览器和
Developer App 均支持流媒体播放。
-
相机拍摄的新功能
了解如何在控制中心中与 Video Effects 交互,包括 Center Stage、Portrait 模式和 Mic 模式。我们将展示如何检测何时为您的 app 启用了这些功能,并探索采用自定义界面以便可从您的 app 控制它们的方式。了解如何启用 10 位 HDR 视频捕捉,并利用最小焦距报告功能,改进视频捕捉体验。探索针对 IOSurface 压缩和提供优异的摄像头捕捉性能的支持。为了解关于摄像头捕捉的更多信息,我们还建议观看 WWDC21 的“捕捉使用视频格式的高质量照片”。
资源
相关视频
WWDC22
WWDC21
WWDC20
WWDC16
-
下载
♪低音音乐播放♪ ♪ 布拉德福特:哈啰 欢迎来到 《新的相机采集功能》 我是相机软件团队的布拉德福特 我即将介绍许多新的相机性能 从最短对焦距离报告开始 如何采集10-bit HDR视频 最主要的内容:控制中心的视频效果 接下来我会稍微离开一下新的性能 介绍让你的相机应用程序 能达到最佳表现的策略 最后 大家一定要收藏这个 全新的表现秘诀 IOSurface压缩 今天我要讲的性能 全部都可以在AVFoundation框架找到 更明确地说 是有前缀AVCapture的类别 先简单回顾一下 最主要的对象是AVCaptureDevices 它代表相机或麦克风 覆盖装置的AVCaptureDeviceInputs 让它们可以连上AVCaptureSession 那是AVCapture图形的中央控制 AVCaptureOutputs 算绘从不同方式得到的输入数据 MovieFileOutput 会录制QuickTime视频 PhotoOutput 会采集高画质的静态照片 和实况照片 数据输出 例如VideoDataOutput 或AudioDataOutput 将来自相机或麦克风的视频 或音频缓冲传送到你的应用程序中 还有其他种类的数据输出 例如元数据和深度 对于实况相机预览 有一种特殊的输出类型 AVCaptureVideoPreviewLayer 它是CALayer的子集 从采集输入得到的数据流 到通过AVCaptureConnections 兼容的采集输出 都在这里用这些箭头表示 如果你不熟悉AVFoundation相机采集 可以从developer.apple.com上的 相机和媒体采集首页来了解更多 好 让我们直接开始深入探索 第一个新性能 最短对焦距离是指镜头 和能够清晰对焦的最近点之间的距离 它是所有镜头都有的特性 可以是数码单镜头反光相机 或是智能手机 iPhone相机也有最短对焦距离 只是我们过去从来没有发表过… 直到现在才出来 从iOS 15开始 最短对焦距离 是iPhone自动对焦相机公开的特性 这里有近期iPhones的样本 图表中显示在不同机型中 广角镜头和长焦镜头的 最短对焦距离之间的差异 在iPhone 12 Pro和12 Pro Max的 广角镜头有很显著的差别 相较于Pro上最短对焦距离为12公分 Pro Max的最短对焦距离为15公分 这是因为在iPhone 12 Pro Max中的 传感器移动防手震技术 同样的 12 Pro Max的长焦镜头 最短对焦距离也比12 Pro更远 这是因为长焦镜头可以 伸到更远的位置 它是2.5x变焦 另一个则是2x变焦 让我快速示范一下 为什么最短对焦距离报告很重要
这里有一个示范用的应用程序 叫做AVCamBarcode 它展示了我们的AVFoundation 条形码侦测API 这个用户界面引导用户 把一个对象放到矩形里面来扫描 在这个例子中 我选了在一张纸上 我选择了一个相当小的二维码 这个条形码只有20毫米宽 按下元数据按钮 我会看到一串 由AVCaptureMetadataOutput支持的 不同对象类型 这里有很长一串 我要选二维码 然后把我的iPhone 12 Pro Max相机 拿到能让二维码填满矩形的位置 很不幸地 因为它太小了 我必须非常靠近那张纸 才能填满预览的空间 那个距离比相机的最短对焦距离还短 条形码太模糊 所以没办法扫描 要引导用户往后退 我需要在相机预览上套用变焦系数…
像这样 看到屏幕上放大的影像 会提示他们把相机拿到 离纸张比较远的距离 我可以用滑块按钮来做这件事 不过如果应用程序可以自动处理变焦 那就更好了
这就是AVCaptureDevice中 新minimumFocusDistance属性的功能 它是iOS 15的新功能 考虑到相机的水平视野 你要扫描的最小条形码尺寸 这里我把它设成20毫米 把相机预览窗口的宽度设成百分比 我们可以简单计算一下 要填满那个预览窗口的宽度 所需要的最短主体距离 接着 用相机 新的minimumFocusDistance属性 当相机没办法在这么近的位置对焦时 我们可以侦测到 并且计算出一个够大的变焦系数 来引导用户往后退 最后 要把它应用到相机上 我们先在组态中锁定它 设定变焦系数 接着再把它解锁 在重新编译我们的示范应用程序后 现在用户界面 会自动使用正确的变焦值
当应用程序启动时 它就已经对焦到正确的位置了 没有模糊的条形码了! 按下去 可以看到它会把我带去哪 啊!《在iPhone摄影中的采集深度》 那场很经典! 我真的很感激那场说明会
请看看新的AVCamBarcode范例 来了解如何纳入最短对焦距离的 最佳实例 还有很多其他扫描条形码的最佳实例 接下来要谈的是10-bit HDR视频 HDR代表高动态范围 它是从iOS 4.1那时候开始 就已经存在的静态影像技术 保存高动态范围通常是通过 在一个场景拍下多个曝光的照片 然后再混合这些照片 来同时保留亮部和暗部而达成的 那么视频HDR呢? 那很困难 因为你必须要做到 每秒30帧或是每秒60帧 这个还不完全是视频HDR 不过很接近了 在2018年 Apple将EDR 或叫延伸动态范围 用到iPhone XS相机上 EDR是一种视频的类HDR解决方案 基本上它让采集帧率加倍 在标准曝光和短时曝光之间转换 不过它是根据时间计算过的 所以在采集中间几乎没有垂直空白 当名义上以每秒30帧的速率采集 EDR视频实际上是以每秒60帧的速率 运作相机 根据拍摄场景的需求 它能够将曝光值得到的色调 动态应用到曝光值0的影像上 来修复过曝的亮部 但是不会牺牲暗部的细节 这还不是完整的HDR解决方案 因为在弱光下 它的效果就变差了 不过在中等亮度到强光下 它都提供很棒的成果 这里是让人困惑的地方 EDR显示为一系列 在videoHDR名字下的 AVCaptureDevice属性 不管你在哪里看到 只要是AVCapture API中的 videoHDRSupported 或者videoHDREnabled 你都应该在脑中把它换成EDR 因为它就是EDR AVCaptureDevice还有一个属性 叫做“automaticallyAdjusts VideoHDREnabled” 它的预设值为真 所以只要EDR能使用的时候 它就会自动被打开 如果因为某种理由你希望把它关掉 你需要把 automaticallyAdjustsVideo HDREnabled设定为假 接着把videoHDREnabled也设成假 现在事情越来越棒了 我需要先跟你们解释EDR 这样我才能介绍10-bit HDR视频 10-bit HDR视频是真正的高动态范围 因为它有更多位! 那代表着更高的可编辑性 它有EDR来做亮部回复 而且它一直都是开启的 它使用混合对数型伽玛曲线 以及BT.2020色域 因此有更好的色彩对比 比Rec 709更亮的亮度 不论你用的是 AVCaptureMovieFileOutput 或者AVCaptureVideoDataOutput 加上AVAssetWriter 我们都自动在你的视频中插入每帧的 杜比视界元数据 让它们和杜比视界显示器兼容 10-bit HDR视频 最早是导入在iPhone 12上 10-bit HDR视频格式可以通过 它们独特的像素格式来辨识 在旧版的iPhone机型上 相机有AVCaptureDeviceFormats 它总是成对出现 就分辨率和帧率范围来说 有420v和420f格式 这些是8-bit、双平面的YUV格式 420v中的v代表视频范围 取值范围从16到235 而420f中的f代表全部范围 取值范围从0到255 在iPhone 12机型上 有些格式是以三个为一组 在420v和420f后 还有x420格式 它也有相同的分辨率和帧率范围 跟420v一样 x420是在视频范围中的 双平面420格式 不过在x420中的x代表10位 而不是8位 要在编码中找到和选取 10-bit HDR视频格式 只要通过AVCaptureDevice格式重复 直到你看到有像素格式符合x420的 或者 先深呼吸一下 你看到 420YpCbCr10 PlanarVideoRange 你当然可以加入其他搜寻条件 例如宽、高和最大帧率 我们更新了AVCam范例编码 来支持可使用的10-bit HDR视频 里面有一个很方便的效用函数 叫做“tenBitVariantOfFormat” 不论目前选取装置的激活格式是什么 它都可以找到其中10-bit HDR的变量 请看一下 所有常用的视频格式 都支持10-bit HDR视频 包含720p、1080p和4K 我们还加入4x3格式 也就是1920x1440 它能支持12百万像素 高分辨率照片
要采集10-bit HDR视频很简单 不过编辑和播放就比较麻烦了 我建议大家去看2020年的相关说明会 叫做《以AVFoundation 编辑和播放HDR视频》 好的 HDR就说到这里
现在要进入我们最主要的内容 控制中心的视频效果 简单来说 它们是系统层级的 相机性能 不需要修改编码 就可以在你的应用程序中使用 而且用户可以控制它 这有一点背离我们的习惯作法 传统上 当我们在iOS或macOS 导入新的相机性能时 Apple的应用程序 可以直接使用这个技术 我们会公开新的AVCapture API 现在你现在在做的事一样 你先学会它们 然后你按自己的步调去使用这些性能 这是比较安全和保守的方法 不过常常导致很长的准备时间 让用户在他们喜欢的相机应用程序中 错过这些很棒的性能 有了控制中心的视频效果 我们在系统层级 导入预先包装的相机性能 让大家不用修改编码就可以马上使用 而且用户可以控制它 我们持续针对这些性能公开新的API 所以你可以在你的发布时程允许下 在你的应用程序中加入这些体验 让我们来看看这些效果 第一个是我们在5月的 踏春而来Apple发布会上发布的 叫做“人物居中” 在最新释出的M1 iPad Pro机型上 有这个功能 并且利用它们惊人的 12百万像素超广角前镜头 人物居中真的提升了 你的FaceTime视频通话品质 在其他所有的视频会议应用程序中 也可以直接使用 而且效果很好 让我示范给你们看 我刚刚从App Store下载Skype 这是这个应用程序现有的版本
当我开始一个Skype视频通话 你会看到人物居中立刻就开始执行 这有点像是拥有自己的 个人相机遥控器 当你在画面中移动时 它会一直把你框在窗口正中间 不论你往镜头靠近 或者往后退 想要走来走去 就算你在镜头上把你的脸转开 它还是可以追踪你 这是因为它不只会追踪脸 它还会追踪身体 身为用户 要操作人物居中很简单 我只要往下滑 叫出控制中心 按下新的视频效果模块 就可以选择了 现在我把人物居中关掉 接着回到应用程序中 现在不管我进出屏幕 它都不会再跟着我了 同时还有一个所有视频会议应用程序 都能使用的新性能 叫“人像” 人像模式让我可以算绘出 很漂亮的浅景深效果 它不只是简单的隐私模糊 它使用Apple的神经网络引擎 加上单目深度网络 来模拟真正带有广角镜头的相机 最后让我们来看看麦克风模式 下滑 选择麦克风模式模块 我可以在标准、语音隔离 或宽广频谱之间做选择 麦克风模式强化 在视频聊天中的音频品质 等一下会再介绍更多 尽管人物居中、人像和麦克风模式 都有出现在控制中心上 它们在API上的处理却不太一样 我会先介绍人物居中API 接着是人像 然后是麦克风模式 所有M1 iPad Pro的前镜头 都可以使用人物居中 不论你使用的是新的超广角前镜头 虚拟的广角镜头 它会呈现裁切后的正规视野 或者虚拟真实深度镜头 都可以使用人物居中 真实深度镜头的使用有一些条件 我待会会说 控制中心的视频效果模块 在每个应用程序都有开/关的切换 这让你可以在开会用的应用程序上 把人物居中做为预设值 同时在专业摄影应用程序中 把它预设成关闭 让你可以手动构图 是在每个应用程序设定个别的状态 而不是针对每个镜头来设定状态 因为人物居中的开/关切换 是在每个应用程序中 而不是在每个相机上 它在API中 是以AVCaptureDevice上的一套 类别属性来呈现 这些是可读取、可写入 以及允许键-值观察的 centerStageEnabled会匹配到 控制中心上的人物居中用户界面的 开/关状态 人物居中控制模式能支配 谁可以切换到开启状态 我们等一下会再多说一些 不是所有相机或格式都支持人物居中 你可以在任何相机的格式数组中 反复执行 找到支持这个性能的格式 并且把它设定为activeFormat 通过查询或观察 它的人物居中激活属性 找出在特定相机上 目前人物居中是否为激活状态 你应该要知道人物居中的限制 人物居中使用超广角相机的 完整12百万像素格式 那是30帧率的格式 所以最大帧率的限制是30 人物居中会避免放大来维持影像画质 因此它的最大输出分辨率 被限制为1920x1440 使用人物居中时 左右和前后对焦需要保持不变 所以视频的变焦系数会锁定在1 几何畸变校正对人物居中 要把人物放到画面中间是不可缺少的 而且深度传送一定要关闭 因为深度产生一定要匹配到 RGB和红外线相机的全视野影像 现在让我们来看看控制模式的概念 人物居中有三个支持的模式 用户、应用程序和合作式 在所有应用程序中 用户模式 都是人物居中控制模式的预设值 在这个模式中 只有用户 可以将这个性能开启和关闭 如果你的应用程序试着以编码更改 人物居中的开启状态 就会出现异常 下一个是应用程序模式 这个模式下 只有你的应用程序 可以控制这个性能 用户不能使用控制中心 因为那里的切换被关掉了 我们不建议使用这个模式 除非你的应用程序和人物居中不兼容 否则不要使用它 如果你必须退出用户模式 你可以把控制模式设定成应用程序 接着把isCenterStageEnabled设为假 人物居中最棒的用户体验 是合作式模式 在这个模式下 用户可以控制控制中心的性能 而且你的应用程序也可以 用自己的用户界面来控制它 不过你得做多一点事 你必须观察 AVCaptureDevice .isCenterStageEnabled的属性 并且更新你的用户界面来确保 用户可以随时开启时人物居中 把控制模式设定成合作式之后 你可以把人物居中设定为真或假 举例来说 这可以是 根据你应用程序中的按钮 合作式模式的典型代表是FaceTime 当我在FaceTime视频通话中 我可以直接使用应用程序中的按钮 来打开人物居中 让它追踪我 或者我可以用惯用的方式 往下滑叫出控制中心 再开启或关闭人物居中 FaceTime和控制中心 在人物居中的状态上相互合作 因此它总是能符合用户的意图 FaceTime也聪明到可以知道 什么时候性能互不兼容 例如 假设我试着打开Animoji 这个功能会用到深度…
它会知道要把人物居中关掉 因为这两个性能互不兼容 如果我重新把人物居中打开 FaceTime会知道要关闭Animoji 人物居中API就说到这里 让我们换到 人物居中在控制中心的邻居:人像 简单来说 它是一种 能漂亮地算绘出浅景深的效果 让它看起来像大光圈镜头 在iOS上 搭载Apple神经网络引擎的 所有装置都支持人像 也就是2018年和 在那之后的iPhone和iPad 它只支持前镜头 所有M1 Mac也都支持这个功能 因为它们同样搭载 Apple神经网络引擎 人像是一个计算复杂性算法 因此 要让视频算绘表现不停反应 它的最大分辨率受限为1920x1440 以及30帧率的分辨率
跟人物居中一样 人像效果在每个应用程序中 都有自己的开/关状态 它的API比人物居中的还简单 用户每次都可以 通过控制中心来控制它 而且它只有在特定类别的应用程序中 才会预设可以使用它 在iOS上 使用 VoIP UIBackgroundMode的应用程序 会自动加入这个功能 用户可以在控制中心 开启或关闭这个效果 其他所有的iOS应用程序 需要宣告它们有资格 使用人像效果来加入 那是通过在应用程序的Info.plist 加入一个新的键 NSCameraPortraitEffectEnabled 在macOS上 所有应用程序都会自动被加入 而且可以直接使用这个效果 人像效果一直都是由用户控制的 而且只能通过控制中心来控制 和人物居中一样 不是所有相机和格式都支持人像 你可以在任何相机的格式数组中 反复执行 找到支持这个性能的格式 并且将它设定为你的激活格式 通过查询或观察它的 isPortraitEffectActive属性 你也可以找出在特定相机上 目前人像是否为激活状态 麦克风模式API和人像相似
每个应用程序中都有用户在选择 用户一直都可以控制它 你的应用程序不能直接 设定麦克风模式 有些应用程序需要选择加入 才能用这个性能 麦克风模式会显示在 AVFoundation的 AVCaptureDevice界面中 一共有三个种类 标准 它使用的是标准音频DSP 宽广频谱 它会让处理最小化 来采集装置周围的所有声音 不过它还是包含回声消除 还有语音隔离 它会增强人声 和移除不想要的背景噪音 例如键盘打字声、按鼠标的声音 或者邻居的鼓风机在某个地方运转 这些功能只有用户可以 从控制中心设定 不过你能读取和观察它们的状态 可以通过AVCaptureDevice的 preferredMicrophoneMode 这是用户选择的模式 还有activeMicrophoneMode 这是用户目前使用的模式 考虑到目前的音频路由 可能不支持用户偏好的麦克风模式 要使用麦克风模式 你的应用程序必须使用Core Audio AUVoiceIO的音频单位 这是一个在视频会议应用程序中 很热门的界面 因为它能执行回声消除 麦克风模式是在2018年 和之后的iOS和macOS装置上才能使用 用户可以控制人像和麦克风模式 不过你可以通过叫出新的 AVCaptureDevice .showSystemUserInterface方法 来提醒他们关掉或打开这个性能 而且你可以把它传到videoEffects 或microphoneModes 叫出这个API会打开控制中心 并且深度链接到适当的子模块 我们正在深入探讨视频效果模块 这里用户可以选择把人像关掉
人像和控制中心的视频效果 就先讲到这里 我一直在跟大家介绍 不需要动到任何一行编码 就能注入你的应用程序中的 系统层级相机性能 这是很强大的概念! 有一场相关的说明会 叫做《以视频格式采集高画质照片》 你会发现我们对于你应用程序中的 静态影像画质做出的改良 同样你不用更动任何一行编码 请去观看那一场 我们已经讲了很多新性能 现在这个阶段 我打算喘口气 来谈谈表现 人物居中和人像都是很棒的用户性能 不过它们会带来额外的表现成本 让我们来看看表现最佳实例 确保你的相机应用程序准备好使用 像是人像和人物居中的新性能 相机应用程序使用AVCapture类别 来传送一个很广的性能数组 最常用的界面是 AVCaptureVideoDataOutput 它让你可以直接把视频帧拿去 进行修订、显示、编码、录制 这些过程… 你想得到的都可以 使用VideoDataOutput的时候 很重要的是要确认你的应用程序 有跟上实时期限 没有任何掉帧 在预设值中 VideoDataOutput 将它的alwaysDiscards LateVideoFrames属性设定为真 让你不会落后 它会在视频数据输出的 处理过程结束时 强制将缓冲队列大小设为1 这样它就不会一直给你最新的帧 和丢掉你还没准备好处理的帧 你也不用经历周期性或缓慢的过程 如果你需要录制你正在接收的帧 像是用AVAssetWriter 那这对你来说就没有用 如果你想要录制处理过的结果 你应该要关掉 alwaysDiscardsLateVideoFrames 并且注意你的处理时间 通过叫出你提供的captureOutput didDrop sampleBuffer委托回调 当掉帧发生时 VideoDataOutput就能告诉你 收到didDrop回调的时候 你可以在其中sampleBuffer的附件 检查droppedFrameReason 这会告诉你接下来该怎么做 才能减少掉帧 有三个原因:FrameWasLate 这代表你的处理时间太长 OutOfBuffers 代表你可能 使用太多缓冲 以及Discontinuity 代表出现系统减速 或硬件故障 那不是你的问题 现在让我们来谈谈该怎么处理掉帧 其中一个最好的办法 是动态地降低装置的帧率 这样做的话 在预览或输出中 就不会发生差错 你只要在执行的时候 把你的AVCaptureDevice 设定成新的 activeMinVideoFrameDuration 第二个方法是简化你的工作量 这样一来你就不需要花这么多时间 接着我们来看看系统压力 那是在你的相机应用程序中 有良好用户体验的 另一个很重要的表现指标 系统压力就是它字面上的意思 系统遇到使用过度或压力 AVCaptureDevice有一个叫做 systemPressureState的属性 里面包含因素和整体水平 SystemPressureState的作用因素 大概隐藏在这三个因素当中 systemTemperature表示装置有多烫 peakPower是在讲电池老化 以及电池是否能快速的提高电压 来满足高峰电力需求 而depthModuleTemperature 表示真实深度相机的 红外线传感器温度有多高 SystemPressureState的水平 是一种指标 它可以让你在妥协你的用户体验前 先采取行动 当它的状态是微不足道 代表一切都很好 尚可 表示压力有一点升高 可能会发生那种 即使你只有进行很少量的处理 但是周围温度很高的状况 出现严重的时候 系统压力变得很高 采集表现可能会受到影响 会建议降低帧率 一旦你进到危急状态 系统压力严重地升高 采集质量和表现严重受到影响 强烈建议要降低帧率 你绝对不会希望压力上升到必须关机 这时候系统压力已经超过危急状态了 在这个状况下 AVCaptureSession 会自动停止 让装置不会持续过热
你有好几种方法来应付升高的压力 降低采集帧率 这一定能减缓系统压力 如果不能降低帧率 考虑减少在你的CPU或GPU上的工作量 例如关掉某些性能 你也可以保留性能但是降低它的画质 可能是通过只用较小的分辨率 或降低频率来处理 AVCaptureSession 绝对不会代替你调节帧率 因为我们不知道 那样降低画质的策略 是否适用在你的应用程序中 表现最佳实例就说到这里 接下来是我们的饭后甜点 IOSurface压缩 在前面表现那段内容 我尽量避免提到内存带宽 因为就视频流过互联网服务供应商 对于最后送到你的照片、视频、预览 和缓冲上的整体内存带宽需求来说 你能做的不多 不过 内存带宽依旧是 用来决定相机性能 是否能同时运作的重要限制 在iOS和macOS处理未压缩的视频时 其中牵扯到很多层 这有点像俄罗斯娃娃 最顶层是CMSampleBuffer 它覆盖所有的媒体数据 以及时间测定和元数据 往下一层是CVPixelBuffer 它专门覆盖像素缓冲数据 以及元数据附加组件 最后 你来到最下层 IOSurface 它能让内存连接到内核 并且提供在不同过程间 分享大型视频缓冲的界面 IOSurfaces很大 它们占掉很多 未压缩视频的内存带宽需求 幸好 现在有IOSurface压缩 提供了内存带宽问题的解决办法 在iOS 15中 我们新加入支持 无损内存视频压缩格式 这是在实时视频中 降低整体内存带宽的 优化方法 它是一种在iOS装置和Mac上的 硬件组件都认识的交换格式 它在所有iPhone 12机型 2020秋季发表的iPad Air 和2021年春季发表的M1 iPad Pro上 都可以使用 哪些硬件组件主要负责处理 压缩的IOSurface? 嗯 有很多 所有列在这里的项目 都知道怎么读取和写入 压缩的IOSurfaces 现在你可能会问说 “我要怎么样才能使用它?” 嗯 跟你们说个好消息 如果你在支持的硬件上采集视频 而且AVCaptureSession 不需要传送任何缓冲到你的过程 恭喜你 你的硬件已经在 所有许可的状况下 利用IOSurface压缩降低内存带宽 如果希望压缩的表面 被传送到你的视频数据输出 你要知道几个规则 真实的内存布局很不明确 而且可能会改变 所以不要写到磁盘上 不要假设在所有平台上 都会有相同的布局 不要用CPU读取或写入 AVCaptureVideoDataOutput支持几种 IOSurface压缩的类型 前面有说过 iOS相机本身会支持 420v和420f这种8-bit YUV格式 一个是视频范围 一个是全部范围 接着 大家认识了x420 这种10-bit HDR视频格式 在要求之下 视频数据输出 也可以从内部扩展成 16像素深度的BGRA 它们每一个都有IOSurface压缩当量 从iOS 15开始 你可以通过 AVCaptureVideoDataOutput来取得 如果你喜欢在你的四字符号编码中 使用“&” 那么这是你的幸运日 它们在这里 很让人眼花撩乱吧 这些是你需要用在编码中的常数 两年前我们释出一个范例编码 叫做“AVMultiCamPiP” 在这个例子中 前镜头和后镜头 会通过multicam 同时被串流到VideoDataOutputs 接着利用Metal着色器 合成为子母画面 之后它会将合成图算绘成预览 并且通过AVAssetWriter写入视频中 这很适合IOSurface压缩 因为它所有的操作都在硬件上执行 这是在AVMultiCamPiP中 既有的VideoDataOutput设定编码 它偏好使用BGRA 所以会设定VideoDataOutput的 videoSettings 产出那种像素格式类型 新的编码只有加上一些检查 首先 它会去看有没有可用的 BGRA的IOSurface压缩版本 如果有 它就会选择那个 else子句只是用来做回退的 今天就到这里 大家认识了最短对焦距离报告 如何采集10-bit HDR视频 在控制中心的视频效果和麦克风模式 表现最佳实例和IOSurface压缩 希望大家会喜欢! 谢谢你们的收看! ♪
-
-
0:01 - Optimize QR code scanning
// Optimize the user experience for scanning QR codes down to sizes of 20mm x 20mm. let deviceFieldOfView = self.videoDeviceInput.device.activeFormat.videoFieldOfView let minSubjectDistance = minSubjectDistanceForCode( fieldOfView: deviceFieldOfView, minimumCodeSize: 20, previewFillPercentage: Float(rectOfInterestWidth))
-
0:02 - minSubjectDistance
private func minSubjectDistance( fieldOfView: Float, minimumCodeSize: Float, previewFillPercentage: Float) -> Float { let radians = degreesToRadians(fieldOfView / 2) let filledCodeSize = minimumCodeSize / previewFillPercentage return filledCodeSize / tan(radians) }
-
0:03 - Lock device for configuration
let deviceMinimumFocusDistance = Float(self.videoDeviceInput.device.minimumFocusDistance) if minimumSubjectDistanceForCode < deviceMinimumFocusDistance { let zoomFactor = deviceMinimumFocusDistance / minimumSubjectDistanceForCode do { try videoDeviceInput.device.lockForConfiguration() videoDeviceInput.device.videoZoomFactor = CGFloat(zoomFactor) videoDeviceInput.device.unlockForConfiguration() } catch { print("Could not lock for configuration: \(error)") } }
-
0:04 - firstTenBitFormatOfDevice
func firstTenBitFormatOfDevice(device: AVCaptureDevice) -> AVCaptureDevice.Format? { for format in device.formats { let pixelFormat = CMFormatDescriptionGetMediaSubType(format.formatDescription) if pixelFormat == kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange /* 'x420' */ { return format } } return nil }
-
0:05 - captureOutput
func captureOutput( _ output: AVCaptureOutput, didDrop sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { guard let attachment = sampleBuffer.attachments[.droppedFrameReason], let reason = attachment.value as? String else { return } switch reason as CFString { case kCMSampleBufferDroppedFrameReason_FrameWasLate: // Handle the late frame case. break case kCMSampleBufferDroppedFrameReason_OutOfBuffer: // Handle the out of buffers case. break case kCMSampleBufferDroppedFrameReason_Discontinuity: // Handle the discontinuity case. break default: fatalError("A frame dropped for an undefined reason.") } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。