Main

WWDC23: Create a more responsive camera experience | Apple

Discover how AVCapture and PhotoKit can help you create more responsive and delightful apps. Learn about the camera capture process and find out how deferred photo processing can help create the best quality photo. We’ll show you how zero shutter lag uses time travel to capture the perfect action photo, dive into building a responsive capture pipeline, and share how you can adopt the Video Effects API to recognize pre-defined gestures that trigger real-time video effects. More Apple Developer resources: Video sessions: https://apple.co/VideoSessions Documentation: https://apple.co/DeveloperDocs Forums: https://apple.co/DeveloperForums App: https://apple.co/DeveloperApp

Apple Developer

2 days ago

[欢快的音乐] Rob:大家好 我是来自 Camera 软件团队的 Rob Simutis 今天和我一起的还有 来自 Photos 团队的 Sebastian Medina 欢迎来到 “打造更流畅的相机体验” 讲座 今天我们将介绍 AVFoundationCapture 类 和 PhotoKit 框架中的 一系列新的强大 API 首先 我们将介绍延迟照片处理 然后 我会演示 如何利用零快门延迟 真正地“捕捉当下瞬间” 接下来 我将介绍我们新的 Responsive Capture API 最后 我将介绍一种以不同的方式 来响应的新视频特效 从 iOS 13 开始 你可以使用 AVCapturePhotoSettings 中 photoQualityPrioritization 的 枚举值来改变响应速度 或者说能以多快的速度拍摄 并获得处理后的照片 然后才能继续拍摄下一张照片 你的 App 可以在 不同的枚举值中进行选择 以达到正确的响应速度 但这样会影响图像质量 或者你想要保证图像质量 但这样又会影响照相间隔时间 在 iOS 17 中 你仍然可以使用此 API 但我们带来了新的补充 A
PI 这样可以提高 拍到想要的照片的几率 同时也能获得更高质量的照片 接下来 我将为大家介绍 我们团队为本次讲座制作的 App 通过切换开关 我们就可以 启用今年的新功能 我们会逐个 构建这些概念 以打造更灵敏的摄影体验 让我们先从延迟照片处理开始吧 今天 为了从 AVCapturePhotoOutput 中 获得最高质量的照片 你会在拍摄照片时使用 设置中的照片质量优先级 枚举值 “quality” 对于 .balanced 和 .quality 值 通常涉及某种类型的多帧融合和降噪 在 iPhone 11 Pro 和更新的机型中 我们最先进的技术之一 又叫做 “深度融合技术” 这项技术可以在高分辨率照片中 提供惊人的清晰细节 在这张深度融合照片中 我们可以看到这 只鹦鹉的羽毛十分清晰、显眼 实际拍摄中 要达到这种效果要有所牺牲 那就是在拍摄下一张照片前 这张照片要先处理完毕 而处理可能要花上一些时间 让我们看看生活中的真实例子 我正在做一份关于 Camera 软件团队 怎样去办公室完成工作的演讲 这是我的同事 Devin 在 Apple Park 中 体验最新的自行车技术 在拍摄时
我需要等待快门键 转完圈后才可以拍摄下一张照片 结果是我得到了 完美的深度融合照片 看看这个胡子的细节! 但当我在拍摄时 照片的处理是同步运行的 这会让连续拍摄变得有些迟缓 因此我虽然得到了 一张细节清晰的照片 但它也许并不是我想拍摄的瞬间 让我们看一看事件流程图 我们先调用 capturePhoto 方式 其位于 设置中的 AVCapturePhotoOutput 而委托会在过程中的 不同阶段接收回调 例如 resolvedSettings 的 willBeginCapture 接着相机软件堆栈 会从传感器中抓取帧 并使用我们的处理技术 将它们融合为深度融合图像 最后 它会通过 didFinishProcessingPhoto 委托回调将照片传回 整个处理过程 必须在下一次拍摄图像前完成 而这会需要一些时间 我们甚至可以在 didFinishProcessingPhoto 回调触发之前调用 capturePhoto 但是它只有在 前一张照片处理完成后才会开始 但是有了延迟照片处理 这个时间轴就变短了 当请求拍照时 相机管线会在合适的情况下 通过一个新的 didFinishCaptu
ringDeferredPhotoProxy 委托回调 传回一张 经过简单处理的“代理”照片 这张代理照片 会先作为占位符被储存到库中 而我们可以马上拍摄下一张照片 系统会在稍后相机会话解除后 处理生成最终的照片 因此 现在如果我在 App 设置中 打开延迟照片处理 捕获会话将重新配置自己 以便在拍摄中适当的时候 向我提供代理照片 现在我可以得到和以前一样清晰的 高细节度照片 但是通过 将照片推迟到稍后再处理 我可以在当下拍摄更多的照片 后轮骑行真不错 自行车很结实 太好了 这张照片正是我的演示需要的 胡子什么的都很清楚 让我们来看看获得延迟处理的照片 都需要哪些部分一起相互作用 让我们简单复习一下 之前的 WWDC 的内容 在配置 AVCaptureSession 来拍摄照片时 我们会将带有 AVCaptureDevice 的 AVCaptureDeviceInput 也就是相机 添加到会话中 接下来 将 AVCapturePhotoOutput 添加到会话中 并选择特定的格式 或会话预设 通常会设置为“Photo”会话预设 当 App 在 photoOutput 上 调用 capt
urePhoto 时 如果这是一张 更适合延迟处理的照片 我们会回调 didFinishCapturingDeferredPhotoProxy 从这里 代理数据会被发送到照片库 那么现在我们在库中 就有了一张代理照片 但我们总归还是要使用 或者分享这张照片 照片的最终处理既可以按需 从库中请求图像数据 也可以在系统 认为合适时在后台进行 例如 设备处于空闲状态时 接下来请我的同事 Sebastian 来展示如何对其进行编程 交给你了 Sebastian Sebastian:谢谢你 Rob 大家好 我是 Sebastian Medina Photos 团队的工程师 今天我将展示如何用 PhotoKit 将最近拍摄的图像进行延迟处理 然后我将请求这张照片 来展示从 PHImageManager 请求接收图像的新功能 不过 在我们使用 PhotoKit 处理资源之前 我们需要先设置好 用于延迟处理的新 Camera API 它可以让我的 App 接收 从 PhotoKit 传输的 延迟处理的代理图片 现在 我将继续 写代码来实现这项功能 在这里 我已经设置好了 AVCapturePhotoO
utput 和 AVCaptureSession 对象 然后我们来配置会话 在这种情况下 我要把会话的预设类型设置为 photo 以便我们可以利用延迟处理 现在我将获取拍摄设备 然后设置设备输入 如果可以的话 我将添加设备输入 然后我要检查 是否可以添加 photoOutput 如果可以的话 就添加它 接下来是新的内容 我将检查新的 autoDeferredPhotoDeliverySupported 值 是否为真 以确保我可以 通过延迟处理发送拍摄的照片 如果检查通过 那么我可以通过 autoDeferredPhotoDeliveryEnabled 属性 来选择使用新的 延迟照片传送 你只需将这两行 延迟照片传送检查和开启 添加到相机代码中 即可启用延迟照片功能 最后 我将提交会话配置 现在 当我们再调用 capturePhoto 方法时 我们收到的委托回调 将带有一个延迟代理对象 让我们看一下其中一个回调示例 在这个照片拍摄回调中 我从相机接收了 AVCapturePhotoOutput 和 AVCaptureDeferredPhotoProxy 对象 它们是我最近拍摄的一张照片的
值 首先 我们最好先确保 收到合适的照片输出值 所以我将检查错误参数的值 现在 我们将开始使用 PhotoKit 将图像保存到照片资料库中 我将对共享的 PHPhotoLibrary 进行修改 但是要注意 我们需要对照片库有写入权限 然后 我将从 AVCaptureDeferredPhotoProxy 对象中捕获照片数据 由于我将对照片库进行修改 我需要设置相关的 performChanges 实例方法 和保存任何的 Asset 一样 我们用一个 PHAssetCreationRequest 然后我将在请求上 调用 addResource 方法 对于参数 我们使用新的 PHAssetResourceType '.photoProxy' 就是它让 PhotoKit 对图片进行延迟处理 然后我可以添加 之前捕获的代理图像数据 在这种情况下 我不会使用任何选项 这里有一点很重要的是 如果我们在不需要延迟处理的 图像数据上使用这种新资源类型 将导致程序错误 说到错误 我最好在完成处理程序中 检查一下有没有错误 就这么简单 你可以根据 App 的需要 在完成处理程序中 处理成功和错误 现在 假设
我想取回 Asset 我可以通过 PHImageManager 请求来实现 所以我接下来 就在代码中这样操作 对于参数 我有一个 PHAsset 对象 对应刚刚通过 PhotoKit 发送的图像 还有返回图片的目标尺寸 以及内容模式 我将获取默认 PHImageManager 对象 然后可以使用 imageManager 对象 调用 requestImageForAsset 方法 来请求图像资源 对于参数 我将使用之前获取的资源 目标尺寸和内容模式 并且在这种情况下 我不使用任何选项 现在 我可以通过 resultHandler 处理回调 其中 resultImage 是一个 UIImage 而 info 是与图像相关的字典 现在 第一个回调 将使用信息字典键值 PHImageResultIsDegradedKey 保存较低分辨率的图像 而最终图像回调则不会 所以 我可以在这里检查一下 通过 PhotoKit 创建处理后的图像 正好可以让我介绍我们的新 API 新 API 将允许你从 requestImageForAsset 方法中接收一个二级图像 由于图像可能需要更长的时间 才能完成
延迟处理 所以这个新的二级图片 可以同时显示出来 要接收这个新图像 你可以使用 PHImageRequestOptions 中新的 allowSecondaryDegradedImage 选项 这个新图像会嵌在 requestImageForAsset 方法的 当前两个回调之间 与图像相关的信息字典 将包含一个 PHImageResultIsDegradedKey 条目 该条目在当前的第一个 图像回调中已经在使用了 为了更好地说明情况 今天的 requestImageForAsset 方法 会提供两个图像 第一个是低质量图像 适合用来在准备 最终的高质量图片时暂时显示 有了这个新选项 我们在当前的两张图像中间 可以获得一张更高分辨率的新图像 在处理最终图像时显示 这张新图片可以让用户 在等待最终图片处理完成时 获得更好的视觉体验 现在 让我们编码使用这个功能 不过这一次 我将创建一个 PHImageRequestOptions 对象 然后 我将新的 allowSecondaryDegradedImage 选项设置为 true 这样 请求就知道 要发送新的二级图像回调 在这里 我可以 接
着继续用我之前写的 requestImageForAsset 方法 不过我要把我刚刚创建的 图像请求选项对象添加进来 由于新的二级图像信息字典 中 PHImageResultIsDegradedKey 的键值为真 就像第一个回调一样 所以我要在这里检查一下 这就是接收新的二级图像的过程 别忘了在结果处理方法中处理图像 以最好地支持你的 App 现在我们就知道 该如何将延迟处理图像 添加到照片库中 以及如何在等待最终图像处理完成时 通过图像请求获得一张高质量的 二级图像 来显示在我们的 App 中 从 iOS 17、tvOS 17 和 macOS Sonoma 开始 这些新功能将和 PhotoKit 的 延迟处理更新同步上线 接下来 让 Rob 继续为我们介绍 其他让相机更灵敏的新功能 Rob:太棒了 谢谢你 Sebastian 让我们深入了解一些细节 以保证我们在延迟照片处理方面 有一个良好的开发体验 让我们先从照片库开始 要使用延迟照片处理 你需要有 写入照片库的权限来存储代理照片 如果你的 App 需要显示最终照片 或以任何方式修改它 你还需要有读取权限 但请记住 你应该只向用户请
求 所需最小的照片库访问权限 以保持最大的隐私和信任 而且 我们强烈建议一旦收到代理 你应尽快将其 fileDataRepresentation 放入库中 因为当你的 App 被转入后台前 你只有很有限的 时间在系统挂起 app 之前继续运行 如果内存压力过大 你的 App 可能会在后台化期间 被系统自动强制退出 尽快将代理放入库可以将 用户丢失数据的可能性降到最低 接下来要注意的是 如果你需要经常 对照片的像素缓冲区进行修改 例如应用滤镜 或是使用 AVCapturePhotoFileDataRepresentationCustomizer 对 AVCapturePhoto 的元数据 或其他属性进行修改 在照片处理完成后 这些更改 不会对库中的最终照片生效 你需要在之后使用 PhotoKit API 对照片进行调整 此外 你的代码需要能够 在同一会话中 处理延迟代理和非延迟照片 这是因为并不是所有的照片 都需要进行额外的处理步骤 例如 在使用 “quality” 照片质量优先级枚举值条件时 用闪光灯拍摄照片并不会像 拍摄深度融合照片时缩短拍摄间隔 你可能还注意到 在 AVCaptur
ePhotoSettings 上 没有选用或者不选用的属性 这是因为 延迟照片处理是自动进行的 如果你选择使用 并且相机管线拍摄了 需要更长处理时间的照片 它会给你发送一个代理 如果不适用 它将给你发送最终照片 因此不需要在每次拍摄时 选择是否开启功能 你只需要在捕获对话开始前 将 AVCapturePhotoOutput 的 isAutoDeferredPhotoProcessingEnabled 值 设置为真即可 最后 让我们谈谈用户体验 延迟照片处理为我们提供了 最佳的图像质量 并大幅缩短了拍摄间隔 但这也只是将最终处理 推迟到了以后的某个时间 如果你的 App 面向的用户是那种 希望立即分享或编辑图像 并且对我们提供的最高质量照片 不那么感兴趣的类型 那么不使用延迟照片处理 可能是明智的选择 延迟处理功能将在 iPhone 11 Pro、 iPhone 11 Pro Max 以及更新的机型上可用 这里还有一些关于使用 AVCapturePhotoOutput 和处理照片库权限的精彩相关视频 那么接下来让我们转向 零快门延迟 并谈谈滑板运动 为了准备接下来关于 相机软件团队交通方
式的报告 我们去滑板公园拍了一些镜头 我先用 iPhone 14 Pro 的动作模式 拍摄我的同事 然后我还想为我的幻灯片拍一些 高质量的高难度动作镜头 不过我可以先告诉大家 我是不会去玩滑板的 我按下快门键 给同事 Tomo 拍了一张在滑板上腾空的照片 但当我打开相册检查拍的照片时 却只拍到了这一幕 我在他跳到最高处时按下了快门 但是却只拍到了他落地的时候 这跟我想要的不太一样 那原因是什么呢?快门延迟 快门延迟经常发生 我们可以把快门延迟看作是 从你请求拍摄 到从传感器读取一个或多个帧 将其融合成一张照片并 交付给你 中间产生的延迟 在这里 时间从左到右流动 左侧是旧的帧 右侧是新的帧 假设第五帧 是你相机取景器中的内容 今天 当我们在 AVCapturePhotoOutput 上 调用 capturePhoto:with settings 时 相机管线就开始从传感器中 获取帧 并运行我们的处理技术 但传感器其实是在我们按下快门键 才开始捕获帧的 也就是第五帧之后 所以我们得到的照片 融合了第六到第九帧 甚至更晚的帧 在每秒 30 帧的情况下 每一帧在取景器中显示的时间为 33 毫
秒 听起来不长 但实际上 一个动作很快就结束了 这段时间足够让 Tomo 着陆 而我就这么错过了他的英雄一幕 有了零快门延迟相机管线 会保持一个滚动环形缓冲区 来保存旧的帧 现在 当你在取景器中看到第五帧 然后按下快门来捕捉 相机管线就会 穿越回过去 从缓冲区抓取旧帧 再将它们融合在一起 这样我们就能得到想要的照片了 现在我将 App 中 设置界面的第二个开关打开 以启用零快门延迟 当 Tomo 腾空时 我再按下快门 就成功拍到了 我的报告需要的英雄时刻 那么你要如何在 App 中 启用零快门延迟呢? 什么都不用做! 我们对链接了 iOS 17 及之后的 App 启用了零快门延迟 适用于 AVCaptureSessionPresets 和 AVCaptureDeviceFormats 其中 isHighestPhotoQualitySupported 为真 但是 你如果在测试过程中 发现结果不符合你的要求 你可以将 AVCapturePhotoOutput.isZeroShutterLagEnabled 设置为 false 以选择不使用它 一旦输出连接到你的会话 你可以通过检查 is
ZeroShutterLagSupported 是否为真 来验证 photoOutput 所配置的预设或格式 是否支持零快门延迟 某些类型的静止图像捕获 如闪光灯拍摄 为手动曝光配置 AVCaptureDevice 曝光时间分段拍摄 以及多个摄像头的 同步帧组合图像传递 都无法实现零快门延迟 由于相机管道在做时间回溯 来从环形缓冲区中获取帧 因此如果在按下快门 和照片发送到 photoSettings 之间 存在较长的延迟 用户可能会在照片中引入相机晃动 因此 你需要在按下快门 和对照片输出执行 capturePhoto API 调用之间 尽量减少任何工作 为了完善我们的功能 打造响应更快的摄影体验 我现在将介绍 Responsive Capture API 这组 API 允许用户 进行重叠拍摄 通过调整照片质量来优化拍摄间隔 并在可以拍摄下一张照片时 提供出色的 UI 反馈 首先是主要的 API Responsive Capture 之前在滑板公园 在启用了前两个功能的情况下 我每秒能拍大约两张照片 我们放慢了录像的速度 以便看得更清楚 在每秒两帧的情况下 我们看不到太多 Tomo
在空中的动作 这就是我拍到的最好的照片 已经很不错了 但是让我们看是否还能拍得更好 现在我将打开第三和第四个开关 以启用 Responsive Capture 功能 我稍后会介绍 Fast Capture Prioritization 那么让我们先回到公园 让我再试一次 启用 Responsive Capture 功能后 我可以在 同样的时间内拍摄更多的照片 让我有更多的机会拍到想要的照片 我决定就用这张“英雄”照片 开始我的报告 我的团队一定会喜欢的! 我们可以将调用 设置 AVCapturePhotoOutput.capturePhoto 方法看作是经历了三个不同的阶段: 从传感器捕获帧 将这些帧处理为最终的未压缩图像 然后将照片编码为 HEIC 或 JPEG 格式 编码完成后 照片输出将调用委托的 didFinishProcessingPhoto 回调 或者如果你选择 使用延迟照片处理 API 则可能调用 didFinishCapturing Deferred Photo Proxy 如果拍摄适合 但是一旦“捕获”阶段完成 并开始“处理”阶段 理论上 照片输出 可以开始另一个拍摄
而现在 这个理论已经成为现实 并可供你的 App 使用 通过选择使用主要的 Responsive Capture API 照片输出将与这三个阶段重叠 以便 在一个请求正在处理阶段时, 可以开始新的照片拍摄请求 从而为用户提供更快速、 更连贯的连续拍摄效果 请注意 这将增加 照片输出所使用的峰值内存 因此如果你的 App 也在使用大量内存 它将形成系统压力 在这种情况下 你也可以 根据需要选择不使用此 API 回到我们的时间轴图表 当我们连续拍摄了两张照片 委托将被调用以处理 willBeginCaptureFor resolvedSettings 和 didFinishCaptureFor resolvedSettings 用于照片 A 但与此同时 你可能会收到照片 A 的 didFinishProcessingPhoto 回调 也就是照片经过编码后被传回的过程 或者可能会得到用于照片 B 的 第一个 willBeginCaptureFor resolvedSettings 现在同时有两个 正在进行中的照片请求 所以你需要确保代码正确处理 两个交错的照片回调 要获得重叠的连续捕捉 首
先要在支持的情况下 启用零快门延迟 只有这样才能获得 Responsive Capture 的支持 然后使用 AVCapturePhotoOutput .isResponsiveCaptureSupported API 来确保照片输出 在预设或格式上支持此功能 然后通过设置 AVCapturePhotoOutput .isResponsiveCaptureEnabled 为真来开启它 之前我们启用了 “Fast Capture Prioritization” 现在我来简要地介绍一下它 当照片输出打开此功能时 它将检测到是否短时间内 连续拍摄了多张照片 并作出相应的调整 将照片质量 从最高质量设置适应 为更为“平衡”的质量设置 以保证连续拍摄间隔 然而由于这可能会影响照片质量 因此默认情况下该功能是关闭的 在相机 App 的设置界面中 这个功能叫做 “优先快速拍摄” 我们选择在相机中将其默认开启 因为我们认为 连贯的快速拍摄 在默认情况下更为重要 但你可以为你的 App 和用户进行不同选择 你可能都已经知道该怎么做了 你可以检查 照片输出的属性 .isFastCapturePriorit
izationSupported 来判断是否支持 当支持时 如果你或你的用户希望使用此功能 你可以将 .isFastCapturePrioritizationEnabled 设置为真 现在 让我们聊一聊 快门键状态和外观的管理 照片输出可以显示当前状态 告诉用户相机什么时候 准备好可以进行下一次拍摄 或者正在处理中 你可以相应地更新快门键 这是通过一个叫做 AVCapturePhotoOutput CaptureReadiness 的枚举值完成的 照片输出可以处于 “notRunning” 和 “ready” 以及三种 “notReady” 状态 包括 “Momentarily”、 “waitingForCapture” 或 “waitingForProcessing” 这些 “notReady” 枚举值表示 如果你使用设置调用 capturePhoto 那么在拍摄和照片传递之间 将会有更长的等待时间 增加了我之前提到的快门延迟 你可以通过使用一个新的类 AVCapturePhotoOutputReadinessCoordinator 来监控此状态变化 当照片输出的准备状态发生变化时
它会回调你提供的委托 即使你不使用 Responsive Capture 和 Fast Capture Prioritization API 也可以使用这个类 以下是你如何使用就绪协调器 和 Readiness 枚举来传达快门可用性 和修改按钮外观的方法 我们的演示 App 在处理 “not ready” 枚举值时 会关闭快门键上的用户交互事件 以防止额外的请求 因多次轻按而意外进入队列 从而导致快门延迟时间过长 在轻按一次快门后 一个带有设置的 capturePhoto 请求 就进入了排队 captureReadiness 状态 会在 .ready 和 .notReadyMomentarily 枚举值之间切换 闪光灯拍摄会处于 .notReadyWaitingForCapture 状态 在闪光灯触发之前 照片输出甚至还没有 从传感器获取帧 因此按钮会变暗 最后 如果你只使用零快门延迟 不使用今年的其他功能 在当前准备状态为 .notReadyWaitingForProcessing 时 你可以将快门键外观显示为旋转动画 以表示每张照片的 捕捉和处理正在进行中 以下是如何在代码中使用
就绪协调器的方法 首先 为照片输出 创建一个就绪协调器 并设置一个适当的 委托对象以接收有关就绪状态的回调 然后 在每次捕捉时 按照通常的方式设置你的照片设置 接下来 让就绪协调器 针对这些设置 开始跟踪捕捉请求的就绪状态 最后 在照片输出上 调用 capturePhoto 就绪协调器将随后调用 captureReadinessDidChange 代理回调 根据接收到的枚举值 你可以更新快门键的状态和外观 以便更好地 告诉用户什么时候 可以进行下一次拍摄 Responsive Capture 和 Fast Capture Prioritization API 可用于搭载 A12 Bionic 芯片 及更高版本芯片的 iPhone 而就绪协调器 则可在支持 AVCapturePhotoOutput 的任何地方使用 现在我们已经在演示 App 中 启用了所有新功能 它可以提供最流畅的相机体验 同时还能拍摄出超级清晰、 高质量的照片 但是 你并不需要使用所有功能 来改进用户体验 你可以只选择适合自己 App 的功能 接下来是本节的最后一部分 视频效果的更新 以前 macOS 的控制中心 提
供了一些视频会议的效果选项 比如人物居中、 人像模式和摄影室灯光等 而在 macOS Sonoma 中 我们将视频效果从控制中心 移动到了自己的菜单中 你将看到相机 或屏幕共享的预览 并可以启用人像模式 和摄影室灯光等视频效果 现在 人像模式和摄影室灯光 可以进行强度的调整 摄影室灯光也可以 在更多设备上启用 我们还有一个 名为“回应”的新效果类型 当用户在视频会议中时 可能想表达对一个想法的赞同 或者对一个好消息竖起大拇指 但却不想打断演讲者的发言 回应效果可以 将你的视频与气球、彩纸等 进行无缝融合 回应遵循人像模式 和摄影室灯光的模板 它们是一种系统级相机功能 可直接使用 无需你在 App 中更改任何代码 想了解更多关于人像模式 和摄影室灯光的内容 请收看 2021 年的讲座 “相机采集的新功能” 我们有三种方法 可以在视频流中使用回应 首先 在 macOS 的新视频效果菜单中 你可以在底部窗格中 点击一个回应效果 其次 App 可以调用 AVCaptureDevice.performEffect for: a reaction type 例如 你可以 在 App 中的某个视图中
设置一组回应按钮 用户可以点击以使用回应 最后 当回应开启时 用户可以 通过做出手势来发送回应 让我们来看看吧 你可以竖大拇指 或者大拇指朝下 双手竖大拇指发送烟花 比心发送心形 单手比胜利发送气球 双手大拇指朝下触发下雨 双手比胜利发送彩带 还有我的个人最爱 双手做摇滚手势触发激光特效 嘿 这些效果真不错 你可以通过 查看要在捕获会话中使用的 AVCaptureDeviceFormat 的 reactionEffectsSupported 属性 来检查 App 是否支持回应效果 AVCaptureDevice 上有一些属性 你可以对其进行读取或键值观察 以了解手势识别是否开启 以及回应效果是否已启用 请记住 由于这些设置受用户控制 你的 App 无法打开或关闭它们 在 iOS 上 原理是一样的 用户可以在控制中心 打开或关闭手势识别 你可以使用键值观察来监听此操作 然而 要在 App 中触发效果 你需要先做一些代码上的调整 现在让我们来看看怎么做 当“canPerformReactionEffects” 属性为真时 调用 reactionType 的 performEffect 方
法 会将回应渲染到视频中 你的 App 应提供按钮 来触发这些效果 通过手势输入的回应在视频中的位置 可能与调用 performEffect 时的位置不同 这取决于用于检测的线索 我们有一个名为 AVCaptureReactionType 的新枚举, 用于表示各种不同的回应效果 例如竖大拇指或气球 AVCaptureDevice 将在捕获会话中 识别并渲染到视频内容中 而 AVCaptureDevice.availableReactionTypes 属性根据配置的格式或会话预设 会返回一组 AVCaptureReactionTypes 这些效果还提供 内置的系统 UIImages 你可以将它们放置在自己的视图中 你可以通过新的 AVCaptureReactionType.systemImageName 获取回应的 systemName 该函数接受一个 AVCaptureReactionType 参数 并返回与 UIImage systemName 构造对应的适当字符串 而且在回应进行时 我们有一个 API 可以通知你 那就是巧妙命名的 AVCaptureDevice.reactionE
ffectsInProgress 用户按顺序执行多个回应时 它们可能会短暂地重叠 因此它会返回一个状态对象的数组 你可以使用键值观察 来监测回应开始和结束的时间 如果你的 App 是 IP 电话会议 App 你还可以 使用这些信息将效果的元数据 发送给远程视图 特别是当用户 由于带宽原因关闭了视频时 例如 你可以代表另一个与会者 在他们的用户界面上 显示一个效果图标 将渲染效果动画添加到视频流中 可能会给视频编码器带来压力 它们增加了内容的复杂性 可能需要更大的 比特率预算来进行编码 通过键值观察 reactionEffectsInProgress 你可以在渲染过程中进行编码器调整 如果你的 App 可以承受 你可以在效果渲染时 增加编码器的比特率 如果你正在使用通过 VideoToolbox 进行低延迟视频编码器 并设置了 MaxAllowedFrameQP VTCompressionPropertyKey 那么我们鼓励你在 App 中 使用各种支持的视频配置进行测试 包括分辨率、帧率 和比特率层 同时根据效果调整允许的 MaxAllowedFrameQP 请注意 当设置一个低的 M
axAllowedFrameQP 值时 特效的帧率 可能会受到影响 从而导致视频的帧率降低 在 2021 年的讲座 “探索 VideoToolbox 中的低延迟视频编码”中 有更多关于使用这一功能的重要信息 你还应该知道 在进行效果处理时 视频的帧率可能会发生变化 例如 如果你将 AVCaptureSession 配置为 以每秒 60 帧的速度运行 那么在没有运行效果时 将得到每秒 60 帧的画面 但是在进行效果处理时 可能会得到不同的帧率 比如每秒 30 帧 这遵循了人像模式 和摄影室灯光的模型 最终帧率可能会低于你所指定的值 如果想要知道该帧率 请查看 在设备上配置的格式下的 AVCaptureDeviceFormat.video FrameRateRange ForReactionEffectsInProgress 与其他 AVCaptureDeviceFormat 属性一样 这只是为你提供 App 的信息 而不是可以控制的内容 在 macOS 和 使用连续互通相机的 tvOS App 中 回应效果将永远启用 在 iOS 和 iPad OS 上 App 可以通过 更改其 Info
.plist 来选择启用该功能 你可以通过在 UIBackgroundModes 数组中声明 你的 App 是 VoIP App 类别 或者通过添加一个值为 YES 的 NSCameraReactionEffectsEnabled 来选择开启功能 在搭载 A14 芯片 或更高版本芯片的 iPhone 和 iPad 上 回应效果和手势识别功能均可以启用 例如 iPhone 12、 搭载 Apple 芯片的 Mac 和 搭载 Intel 芯片的 Mac 以及使用 连续互通相机的 Apple TV 连接到 USB-C iPad 和 搭载 Apple 芯片的 Mac 的 Apple Studio 显示器 以及第三方相机也可以使用这些功能 我们今年的关于利用新 API 打造流畅相机体验的讲座 就到此结束 我们介绍了如何利用延迟照片处理、 零快门延迟以及 Responsive Capture API 打造出最灵敏 同时还提高了图片质量的摄影 App 我们还介绍了 如何通过更新后的视频特效 包括新的回应 让用户真正表达自己 我已经等不及看到大家会对 这些精彩的新功能会做出什么反应了 感谢你的观看 [
欢快的音乐]

Comments