大多数浏览器和
Developer App 均支持流媒体播放。
-
在你的 App 中支持电影效果模式的视频
了解电影效果相机 API 如何帮助你的 App 处理在相机 App 中拍摄的电影效果模式视频。我们将分享电影效果模式视频的基础知识,包括对焦决策层级,向你展示如何在 App 中使用和更新对焦决策,并帮助你保存和加载这些更改。
资源
相关视频
WWDC17
-
下载
♪ ♪
Rasmus:大家好 我叫 Rasmus 是 Camera Algorithms 团队 的工程师 专注于计算视频 非常开心要向你介绍电影效果模式 也很激动要向你展示 如何利用全新的电影效果模式 API 将充满魔法的电影效果模式 集成到你自己的 App 中 在本次演示中 我将逐步介绍 使用这个 API 构建示例 App 的必要步骤 这个 App 具备回放和编辑功能 将展现电影效果模式超凡的能力 但在我开始讲解集成之前 让我先向你展示 电影效果模式是什么 如何拍摄 以及拍摄后的后续操作 我们在 iPhone 13 中 引入了电影效果模式 它实际上就是一个 能放入口袋的小型电影制作团队 它提供了 一部可以拍出漂亮的浅景深和 自然的焦点渐变的相机 一位通过转换焦点 引导视觉和叙事的导演 一位提前规划关键帧 并实现焦点平滑过渡的跟焦师 那么 如何使用电影效果模式呢? 它可直接在 iPhone 13 和 iPhone 14 系列的 任何设备的相机 App 中使用 并在录制时提供渲染预览 不论你是有抱负的独立电影制作人 还是只想给露营旅行视频 增添一些魔力的爱好者 都可以轻松上手 我曾梦想成为一名电影制片人 但我也热爱使用电影效果模式 来记录自己家人的生活 而电影效果模式的魔力远不止于此 它还具备其他令人惊喜的功能 你可以在拍摄后 进行一些惊人的非破坏性编辑 你可以调整光圈 以改变焦外成像的程度 也可以使用其他检测跟踪方法 来改变焦点和叙事方式 视频中展示了 在照片应用中进行的后期编辑 你也可以在 iMovie 剪辑、 Final Cut Pro 和动态等 App 中进行编辑 而现在 通过引入电影效果模式 API 你可以在自己的 App 中回放和编辑 使用了电影效果模式的视频 电影效果模式 API 已在新版 macOS Sonoma、iOS 17、 iPadOS 17 和 Apple tvOS 17 上广泛可用 真是一项令人兴奋的技术! 首先 我将从一些 有关特殊电影效果模式资源 和数据流的基础知识开始 然后 我将逐步介绍获取和 播放电影效果模式资源的具体步骤 以及改变光圈等简单的回放调整 接下来 我将介绍如何进行非破坏性 编辑 在电影效果模式中调整焦点 以及如何保存和加载这些编辑更改 我还将介绍一些 新的电影效果模式 API 调用 并提供一个示例代码 App 可作为详细参考 正如之前所说 我会首先介绍 有关电影效果模式的一些基础知识 电影效果模式 实际上由两个文件组成 并且存在从一个文件 到另一个文件的数据流 首先是渲染资源 这是一个应用了 电影效果模式特效的文件 可以导出、共享 和播放为常规的 QuickTime 电影 然后是特殊的电影效果模式资源 其中包含 创建渲染资源所需的所有信息 这种资源 允许你进行非破坏性的后期编辑 例如更改光圈 和重新调整焦点以符合你的叙事 让我们先来看一下渲染资源 并用一些电影摄影的基础知识 来解析一镜到底的拍摄方式
开场镜头:我们进入了 一场明显很重要的街头手球比赛 通过聚焦在重点主体身上 我们真切地感受到了紧张气氛 他准备开始一次重要的比赛 他与队友进行了确认 他的队友也准备好了 调整焦点到他身上 强调他已经准备好了 我们将焦点调回到我们的主角 是时候了 让我们一刀切断紧张的氛围
他做出了动作 却完全搞砸了 这个情节转折为观众 带来了一些幽默和轻松的氛围 现在让我们改变叙述方式 将其聚焦在团队合作上 并将镜头早早聚焦于 团队成员 而不是来回切换 始终保持对他的聚焦 我将成为他的思绪之声 “亲爱的伙伴 我爱你 但你总是拖拖拉拉” “是的 我准备好了 但我期望不高” “真是浪费时间 好极了” 这段视频是使用 iPhone 13 拍摄的 展示了电影效果模式 提供的用于叙事的摄影工具 为了生成这个渲染资源 我们有一个 特殊的电影效果模式资源 为了支持非破坏性的后期编辑 电影效果模式素材 实际上包含多个轨道 首先是视频轨道 即拍摄到的原始 QuickTime 视频 它可以是 HDR/SDR 格式 1080p 分辨率 30 帧每秒 甚至在 iPhone 14 上可以达到 4K 分辨率 每秒 24、25 或 30 帧 这个轨道可以像普通视频一样播放 但与渲染资源相比 它缺乏美感和叙事性 没有悬念和喜剧的轻松氛围 我们只是观看一些人在后巷玩游戏 第二个轨道包含视差信息 即从两个摄像头拍摄的 同一场景中观察到的像素位移 近处的物体 比远处的物体更明显地发生位移 你可以自己尝试 先闭一只眼 再闭另一只眼 观察不同距离的物体如何发生位移 视差信息 用于对焦和渲染浅景深效果 视差地图的分辨率低于视频轨道 作为一个色彩化的轨道 它包含相对视差而不是绝对视差 这意味着它只能相对于 同一地图中的其他样本使用 例如相对于一个焦点视差的渲染 或在两个焦点视差之间进行过渡 如果你对相对视差 和有趣的深度概念感兴趣 我强烈推荐观看 WWDC17 的视频 “关于 iPhone 摄影中的深度捕捉” 第三个轨道 包含渲染和编辑所需的重要元数据 该轨道由两个部分组成 首先是渲染属性 包括焦点视差 和光圈 (以 f 数表示) 它们驱动着渲染过程 焦点显示为覆盖层 由电影效果引擎决定 而光圈由用户选择 然后 还有电影效果剧本 其中包含所有自动场景检测
这个场景显示了面部、头部和躯干 它们在可能的情况下 在一段时间内通过 ID 连接在一起 剧本还包含焦点决策 决定聚焦于哪个检测对象 焦点决策可以在捕捉后 更改 以跟随其他检测对象 从而改变叙事和渲染 这是从电影效果模式资源 到渲染资源的数据流 正如刚刚介绍的 电影效果模式资源包含了 所有渲染和拍摄后的 焦点和光圈的所需信息 接下来是可选的编辑 其中更改是非破坏性的 并且始终可以恢复到原始状态 如果没有进行编辑 电影效果引擎会自动控制焦点视差 而用户在使用时 设置的光圈保持不变 有了焦点视差和光圈 渲染应用了浅景深 并使用视差图实现准确的焦点衰减 最后 我们获得了 应用了特效的渲染资源 它是一个常规、 可共享的 QuickTime 电影 有了对电影效果模式的充分理解 现在是时候开始构建回放 App 了 首先 我们需要获取 电影效果模式资源 让我们查看代码以获取 从图库中选择 一个电影效果模式资源非常容易 只需使用照片选择器 并筛选电影效果模式视频 选择器将为 所选文件获取原生标识符 作为与代码无关的附注 如果你还没有电影效果模式资源 可以通过所有照片数据选项 在不同用户设备之间进行隔空投送 以同时获取渲染资源和 电影效果模式资源 让我们回到代码 使用所选的资源标识符 我现在可以在请求它之前 获取含有电影效果模式信息的 照片资源 我需要确保 设置请求选项以获取原始版本 并允许网络访问 以防资源位于 iCloud 上 然后最后 请求电影效果模式资源作为 AVAsset 现在到了令人兴奋的部分 我们已经获得了电影效果模式资源 让我们集成回放功能 使用 AVPlayer 和 AVPlayerItem 渲染资源可以像普通影片一样播放 电影效果模式资源中的 影片轨道也可以 但要发掘电影效果模式资源的潜力 我们需要 添加一个自定义视频合成器 用它处理多个轨道和用户更改 最后 调用电影效果渲染器 来合成输出 这个自定义合成器 还可以用于缩略图和离线导出 但让我们专注于将其用于 电影效果模式资源的回放和编辑 我将仅介绍 与电影效果模式 API 相关的细节 对于自定义 视频合成器类和 HDR 的更多信息 我推荐观看 WWDC20 的 “使用 AVFoundation 编辑和回放 HDR 视频” 让我们开始使用电影效果模式 API 电影效果模式 API 的前缀是 CN 因此你可能能够找到 设置渲染会话所需的三个 API 调用 它们将渲染出浅景深效果 第一个调用是从电影效果模式资源 获取渲染属性 第二个调用 是使用这些属性设置渲染会话 渲染会话使用图形处理器 因此我需要提供一个 Metal 命令队列 最后一个调用 是将渲染质量设置为导出 质量可以根据性能 和质量约束设置为不同的枚举值 例如预览和导出 在以下代码片段中 我已 删除了一些很好的实践错误检查 例如 guard let else 错误 以便专注于核心代码 自定义合成器需要 一个包含用于渲染输出 所需的电影效果资源信息的合成 在通常情况下 你需要多个步骤来添加多个轨道 但幸运的是 我们提供了一种 简便的方法 只需一步即可完成 你可以直接将所有轨道 从资源信息添加到合成中 电影效果合成信息 与电影效果资源信息类似 但它指向的是合成轨道 然后 我从电影效果资源中 获取电影效果脚本 电影效果脚本 包含所有检测和焦点决策 稍后我将更详细地介绍这个 对于自定义合成器 我设置了使用渲染会话的指令 使用资源轨道的合成 电影效果脚本 以及表示为 f 数值的光圈值 这个自定义指令描述了 如何合成渲染的电影效果内容
为了播放视频 我需要一个视频合成 其中我将添加 来自电影效果合成的轨道 ID 添加一个示例自定义合成器 这是调用渲染器合成特效 并添加合成指令的地方 让我们更详细地了解 自定义合成器中的操作 在自定义合成器 的 startRequest 函数中 有一些特定于 电影效果 API 的关键事项 使用来自电影效果合成的轨道 ID 我从原始视频轨道、视差轨道 和元数据轨道 获取当前帧的源缓冲区 最后 我为渲染输出创建一个缓冲区 这些缓冲区 使我们能够进行编辑和新的渲染 我可以从元数据缓冲区中 获取驱动图像渲染的 渲染帧属性 元数据是一个不透明的结构 因此 我将使用 CNRenderingSession 直接获取帧属性 有了帧属性 我现在可以进行可选的回放编辑 在这个例子中 通过根据指令 改变光圈的 f 数值 我可以在 UI 元素中改变光圈值 焦点视差也可以用类似的方式改变 但稍后我会再详细介绍如何 使用检测进行场景驱动的焦点变换 此时 我们距离实现回放非常接近了 我只需在渲染命令队列上 获取一个命令缓冲区 以便在图形处理器上渲染合成的输出 使用更新的帧属性和图像、 视差缓冲区渲染编码 为输出缓冲区添加完成处理器 它将传递给视频合成 最后提交命令缓冲区 现在让我们试着 在示例 App 中进行回放 我现在可以从图库中 选择电影效果模式资源
当我播放资源时 特效会实时应用
我可以在视频 播放过程中前后拖动进度条 并通过调整光圈 来改变焦外成像效果
将光圈缩小时 背景模糊的效果会减小
将光圈放大时 背景模糊的效果会增加 当前的背景模糊效果可能太强烈了
我认为这样的效果看起来很好
这个 App 已经很棒了 但在接下来的编辑部分中 它将变得更棒 提醒一下 作为参考 每个部分的代码 在示例 App 中都可用 我将继续扩展回放 App 和自定义视频合成器 通过改变电影效果脚本来改变焦点 进行更高级和非破坏性的编辑 让我们重新审视电影效果模式下的 Photos App 编辑环境 特别关注焦点 焦点是在拍摄过程中通过检测对象 并决定焦点位置 和焦点对象自动驱动的 这些检测和决策 都记录在电影效果脚本中 而脚本可以根据你的叙述进行修改 在视觉效果中 焦点检测以黄色方块形式显示 在时间轴下方我们可以 看到关键帧和焦点决策的变化 为了更好地理解这个过程 我们通过一个简单的例子 来解析电影效果脚本的结构 我们从一个短序列的 两个电影效果脚本帧开始 每个帧包含了 特定时间点的所有检测结果 本例中只有两个检测结果 这些检测结果 编为组 ID 进行一段时间内的追踪 将面部、头部和躯干分组在一起 此外 还可以检测和跟踪猫、狗和球 但在这里我们只关注 演员 1 和演员 2 的面部 在第一帧中 自动基础决策 将焦点放在演员 1 身上 并且焦点会一直 跟随这个轨迹 直到出现新的决策 即使演员 3 进入场景 并引入了新的面部检测轨迹 焦点仍然保持在演员 1 身上 在第 5 帧时 自动关键帧事件改变了 决策 并将焦点转移到演员 2 身上 仅仅经过四个帧 演员 3 就悲伤地离开了 没有得到她应有的关注 剩下的序列中 焦点始终集中在演员 2 身上 这些自动基础决策 是根据一系列参数来决定的 例如谁面对摄像机、谁看向别处、 谁距离更近以及有趣的元素等 尽管我们尽力创造一个好的叙述 但你可能有其他的故事构思 幸运的是 决策是可以 更改的 而且有两种方式可以实现 第一种方式是添加一个弱用户决策 这样可以在演员 3 出场时聚焦于她 然而 弱决策只能跟随一个轨道 直到下一个基础决策 或用户决策出现 决策在第 5 帧发生 接下来的帧中 焦点转移到了演员 2 身上 因此 如果我们 希望焦点保持在演员 3 身上 我们可以 在第 5 帧添加另一个弱决策 或者使用更强有力的决策 是的 你可能已经猜到了 那就是强用户决策 强决策将会保持对一个主体的聚焦 直到下一个用户决策 将焦点转移到其他地方 或检测轨迹结束 通过添加一个 强决策 演员 3 成为焦点 并覆盖了后续的基础决策 在演员 3 的检测轨迹结束后 焦点会回到基础决策 即聚焦在演员 2 身上 决策层次结构的工作原理如下: 在基础决策之上是用户决策 当可能时 用户决策会生效 基础决策则填补空缺 因此 就像这个例子中所做的一样 用户可以仅更改脚本的某些部分 当检测轨迹结束时 两种决策都会回到基础决策上 而强决策会尽可能保持其焦点轨迹 在修改脚本之前 让我们先获取 一个脚本帧并绘制检测框 首先从视频合成请求中获取帧时间 然后获取该时刻的电影效果脚本帧 这个脚本帧包含了 所有的检测结果 包括焦点检测 现在可以轻松地绘制检测框了 通过迭代脚本中的所有检测结果 可以获取每个 检测矩形 并使用绘制命令将其 绘制到与 renderEncoder 关联的纹理上 在这个例子中 检测结果以白色绘制 为了强调当前的 focusDetection 我们使用另一种颜色来绘制它 我直接从电影效果脚本帧中 获取焦点检测对象 获取其对应的矩形区域 并通过使用黄色矩形使其显眼 即将焦点检测对象绘制为黄色矩形 现在 我们可以尝试带有刚刚添加的 检测叠加层的回放 App 了 现在可以启用 新的检测叠加层 绘制检测结果
这个场景中 脸部、头部和躯干以白色显示 焦点检测以黄色显示 你可以根据需要自定义叠加层 只显示特定的检测结果子集 开始回放后 注意焦点和渲染 是如何跟随 黄色焦点检测在整个影片中移动的 而其他检测结果则以白色显示 现在 让我向你展示如何使用其他检测结果 来改变焦点 现在我们了解了如何绘制检测框 实际上 使用 UI 点击点 来更改脚本与它非常类似 再次迭代所有的检测结果 如果点击点位于某个检测结果内部 则获取其对应的 detectionID 并创建一个新的决策 可以在 UI 中设置决策的强度 在示例 App 中 通过轻点一下 设置为弱决策 轻点两下设置为强决策 但实际上 UI 的设计 完全取决于你
最后 将新的用户决策 添加到电影效果脚本中 脚本就改变了 让我来介绍一下更新后的 电影效果 API 是如何驱动焦点的 现在 我们 将把它视为正常的剪辑长度 并考虑三个决策 及其相应的焦点检测轨迹 我们可以将焦点轨迹在一个 二维图中按时间和距离进行排列 由于电影效果引擎 了解整个更新后的脚本 它可以提前进行平滑的焦点转换 它看起来大致是这样的 对焦架提前开始移动 以在每个关键帧的开始时达到焦点 这种方式非常神奇 就像一名专业的跟焦师 了解场景标记 可以提前调整焦点 引导观众的注意力
我们可以直接 从更新后的电影效果脚本 的任意帧中访问可调整的焦点视差 我已经展示了如何提取脚本帧 改变焦点的帧属性和改变光圈值 非常类似 一旦我获得了 来自更新后的脚本的脚本帧 我可以直接更新焦点视差的帧属性 这将根据更新后的脚本 以平滑的过渡将焦点传递给渲染器 在示例 App 中 我们可以 通过轻点来更改脚本和焦点 从回放模式切换到编辑模式 我就可以更新电影效果脚本 我可以通过轻点一下 来改变焦点决策 会得到一个弱决策 表示为一个黄色虚线框 或通过轻点两下得到一个强决策 表示为一个黄色实线框 当我在不同的球员身上切换时 你可以看到对焦和渲染 如何根据我的用户输入而变化 我觉得这非常酷 拖动、拖动、 轻点、轻点、轻点 调整光圈 拖动、轻点、轻点、轻点两下
现在我完成了编辑 如何保存这些更改呢? 脚本更改可以 保存在单独的数据文件中 这意味着原始数据保持不变 你始终可以将更改还原回原始状态 我获取脚本更改 并将其表示为紧凑的二进制数据 然后将其写入数据文件 电影效果 API 可以处理这些数据表示 你需要将 这些数据存储在你的 App 中 以便需要时重新加载 加载脚本更改 只需三个同样简单的步骤 从数据文件 获取二进制数据 解包脚本更改 然后把更改重新加载到 电影效果脚本中 更改也可以与原始脚本同时加载 这就是我们如何进行 电影效果脚本更改的编辑、 渲染、保存和加载 如之前所述 你可以使用自定义视频合成器 导出渲染后的视频 这些视频可以直接渲染回图库 示例代码详细介绍了这个过程 API 还包括了跟踪器 CNObjectTracker 用于没有自动检测的对象 示例代码中展示了如何通过 轻点未检测到的对象来激活追踪器 追踪器会生成一个检测轨迹 并可以添加到脚本中 现在来介绍一些更高级的功能 你还可以通过提供 自己的追踪器来添加自定义跟踪 并将自定义检测轨迹添加到脚本中 你可以以帧为单位 对渲染属性进行自定义更改 从而实现自定义的过渡和光圈变化 我个人对电影效果模式和新的 API 能做什么感到非常期待 无论是简单的 App 还是复杂的编辑器 我相信你可以想出 我们甚至都没有想到的创意 这是对新的电影效果 API 的介绍 它允许你集成电影效果模式视频资源 进行带有回放调整的回放、 更改电影效果脚本和焦点 进行非破坏性编辑和新的渲染 并保存和加载这些脚本更改 请在附带的示例 App 中查看更多内容 感谢你的关注 祝你编程愉快 ♪ ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。