大多数浏览器和
Developer App 均支持流媒体播放。
-
在 iPadOS App 中支持外部摄像头
了解如何使用 AVFoundation 捕获类在 iPadOS App 中发现并连接到外部摄像头。我们将向你展示如何旋转来自外部和内置摄像头的视频、支持具有 USB-C 端口的外部麦克风以及执行音频路由。探索电话支持、优化回声消除的调整以及外部摄像头采用的最佳实践。
资源
-
下载
♪ ♪
Nikolas:大家好 欢迎观看讲座 “让 iPadOS App 支持外置摄像头” 我是来自 Camera Software 团队的 Nikolas Gelo 本次讲座的内容是关于如何 让你的 iPad App 支持外置摄像头 台前调度的强大功能包括跨屏幕 拓展 iPad 的显示屏 有了 iPadOS 17 App 可以开始使用外置摄像头 比如这个 Apple Studio Display 的摄像头 我们打开了这台 iPad Pro 的 FaceTime 通话 它正使用它连接的显示器摄像头 这就很棒 因为我在这台 大 Apple Studio Display 显示器上运行 App 时 通话另一端的人可以 从一个更好的角度看我 我也可以使用这台 设备的人物居中功能 这样即使我四处移动 也会显示在画面里
FaceTime 通话、Code Scanner 和 WebKit 都使用了外置摄像头 它们为你的 App 能够 实现的功能提供了绝佳示例 使用没有内置摄像头的显示器时 比如 Apple Pro Display XDR 用户通常会在显示器 上方安装一个 USB 摄像头 如果 USB 摄像头连接了显示器 那么显示器接入 iPad 时 你的 App 也可以使用这个摄像头 你的 iPad App 可以使用 外置摄像头和网络摄像头 来拍摄照片 录制视频 它们也支持其他的系统相机功能 比如控制中心提供的人像虚化 和摄影室灯光视频效果
带有 USB-C 连接器的 iPad 支持外置摄像头 你的 App 可以使用 符合 USB Video Class 也就是 UVC 协议规范的设备 这个协议制定了 USB 设备 支持流媒体视频播放的标准 你的 App 可使用很多热门摄像头 部分外置摄像头有内置麦克风 你的 App 也可以使用这些麦克风 一些制造商生产了符合 UVC 协议规范的非摄像机设备 比如可在多个输入间进行切换 从而输出单一视频流的 HDMI 切换器 iPadOS 也支持你的 App 使用这些类似的设备 外置摄像头支持是对 iPad 丰富的 媒体生态系统的一个极大改善 我会从发现和用法开始向大家介绍 如何让你的 App 支持外置摄像头 接下来我们回过头来 揭晓视频旋转的奥秘 然后再说明如何让 App 使用外置摄像头 附带的麦克风 最后再讨论你 App 的最佳做法 我们先讨论一下如何让 iPad App 支持使用外置摄像头 iPad App 使用摄像头 来实现多种功能 比如拍摄照片、录制视频、 或者通过网络发送 摄像头画面进行视频通话 AVFoundation 框架让你的 App 能够使用内置和外置摄像头 特别是 它的 AVCapture-prefixed 类 我们来回顾一下 如何让 App 支持使用摄像头 首先 App 使用带有摄像头 和麦克风的 AVCaptureDevices 然后 把 AVCaptureDevices 封装 在 AVCaptureDeviceInputs 里 使其能够接入 AVCaptureSession AVCaptureSession 是 AVCapture 图的中央控制对象 AVCaptureOutputs 以多种方式呈现输入数据 MovieFileOutput 会录制 QuickTime 视频 PhotoOutput 能捕捉 高质量的静态照片和实况照片 数据输出 比如 VideoDataOutput 或 AudioDataOutput 把来自摄像头或麦克风的 视频或音频缓冲区传递到你的 App 数据输出还有其他类型 比如元数据和深度 针对实时摄像机预览 我们有一种特殊的输出类型 叫 AVCaptureVideoPreviewLayer 它是 CALayer 的子类 数据通过 AVCaptureConnections 从捕捉输入流向兼容输出 这些类可以在 iOS、 macOS 和 Apple tvOS 上使用
如果你刚开始了解 AVCapture 我推荐你访问 developer.apple.com/cn/ 的 采集设置启动页面 来进一步了解更多信息 在 iPadOS 17 中 你的 App 可以 借助 AVCapture 访问外置摄像头 如果你的 App 已经使用了内置摄像头 你可以进行简单的更新 使其开始使用外置摄像头 发现外置摄像头也很容易 每个外置摄像头都由一个 AVCaptureDevice 实例来表示 你可以通过 AVCaptureDevice 和 AVCaptureDeviceDiscoverySession 的既有 API 来发现它们 AVCaptureDevice 有三种主要属性: 媒体类型、设备类型和位置 外置摄像头和内置摄像头 一样提供视频媒体数据 只是它们的设备类型是外置 对于熟悉使用外置摄像头的 macOS App 开发者来说 他们将弃用未知的外置设备类型 因为外置摄像头可以 独立于 iPad 单独移动 所以它们的设备位置不确定 我们可以使用这三个属性 通过 AVCapture API 找到外置摄像头 让 App 支持使用 外置摄像头很简单 我将在本次讲座中修改 流行的示例相机 App AVCam 从而在 Apple Studio Display 的外置摄像头中流式传输 你可以在 developer.apple.com/cn/ 下载我在本次讲座里更改 后的完整版本 AVCam 目前 App 使用的是内置摄像头 用户按下按钮 就可以在前置和后置摄像头 之间进行切换 AVCam 启动时启用的是后置摄像头 我会修改一下代码 让 App 先访问 外置摄像头再访问内置摄像头
这台 iPad 已经连接 到了 Apple Studio Display 上 我将运行这个 App 它启动时使用的会是外置摄像头
好极了 AVCam 现在正在使用外置摄像头 实现这一点所需要的只是几行代码 AVCaptureVideoPreviewLayer 默认镜像外置摄像头 这一点适合使用 Apple Studio Display 的摄像头 如果你愿意的话 也可以禁用这个行为 我会在本次讲座最后的最佳做法部分 向大家介绍如何禁用 现在我把 App 移到 iPad 的屏幕上
有趣的是 我把外置摄像头拔掉了
啊哦 App 的摄像头预览卡住了 它现在没在使用任何摄像头 AVCam 需要更多修改 来处理外置摄像头的 连接和断开事件 外置摄像头要特别注意 因为和内置摄像头不同 用户可以随时把它们 和 iPad 连接起来或者断开 你的 App 可以监测这些事件 知道摄像头什么时候可用 什么时候不可用 如果重连了同一台物理设备 它会使用一个新的 AVCaptureDevice 实例来表示 你的 App 可以使用现有 API 监测连接和断开事件
你可以键值观察 AVCaptureDevice 的 isConnected 属性或者 AVCaptureDeviceDiscoverySession 的 设备属性 这些属性会随着 摄像头的连接和断开更新 连接状态发生变化时 AVCaptureDevices 也会给出提示 你的 App 可以注意这些 提示来监测摄像头的可用性 系统调用键值观察代码 在后台队列中发布提示 所以要确保你的处理和 AVCaptureSession 队列 以及主线程同步
再回到 AVCam 我会添加一些代码来监测 外置摄像头的连接和断开事件 App 查找默认设备后 它会观察摄像头什么时候断开连接 如果断开了 AVCam 就会切换到内置摄像头 现在我们启动了这个 App 它使用的还是外置摄像头 如果和外置摄像头断开连接了 它就会切换到内置摄像头
但是如果重新连接了外置摄像头 AVCam 不会再切回外置摄像头
AVCam 在运行时应该怎么 处理连接的外置摄像头呢? AVCam 应该在我插上外置 摄像头后切换到这个外置摄像头吗? iPad App 使用外置 摄像头的一个棘手问题就是 处理连接和断开事件 为了让这件事情更简单 iPadOS 引入了 自动相机选择的 API 这个 API 让你的 App 集成操作系统 选择最佳的可用摄像头 这是你的 App 更换摄像头的另一种方式 macOS Ventura 引入了 自动相机选择的 API 来支持连续互通相机 我在本次讲座中 描述的操作是 iOS 特有的 如果你想了解更多在 Mac 上使用该 API 的相关信息 请观看我们以前 2022 年的讲座 “让 macOS App 使用连续互通相机” 及其部分“创造神奇体验”
自动相机选择通过 iOS 上 AVCaptureDevice 引入的两类新属性来实现 即 userPreferredCamera 和 systemPreferredCamera 这两种属性都属于键值观察
userPreferredCamera 是一个读/写属性 它表明用户选用的是哪个摄像头 每当用户在 App 中选择摄像头时 我们要设置这个属性 这样可以让系统了解用户的偏好
systemPreferredCamera 是只读属性 指定由系统决定的最佳摄像头 默认情况下 系统推荐使用前置摄像头 但是如果你想使用后置摄像头 App 会向系统反馈 这个你期望的行为 随着用户选择不同的摄像头 推荐也会发生变化 但是你可能想知道系统是 怎么知道哪个是最佳摄像头的 我稍后再深入讲解这个问题 我先介绍一下 AVCaptureDevice 的 userPreferredCamera 属性 有了这个属性 系统会 储存一段简短的历史记录 记录每个 App 启动和 系统重启时选择的摄像头 它让你的 App 把用户的历史记录 和系统当前连接的摄像头结合起来 所以如果一个摄像头断开连接的话 系统就会基于用户的历史记录 返回下一个可用的摄像头
如果没有用户选择历史 或者选择的摄像头都没有连接上 系统就会一直尝试 返回一个随时可用的摄像头 并优先推荐以前流式传输过的摄像头 你的 App 可以使用 这个属性让系统储存 用户的摄像头偏好
AVCaptureDevice 的 systemPreferredCamera 属性 智能地返回可使用的最佳摄像头 它先检查用户的摄像头偏好 然后用户把外置摄像头 连接到 iPad 上的时候 系统就会返回这个新设备 这是因为 用户 连接新摄像头的时候 他们就暗示了 使用这个摄像头的意图 这两种输入 决定了系统的首选摄像头 自动相机选择 API 让 App 灵活选择和系统的集成方式 尽管只有 iPad 支持外置摄像头 iPhone App 也可使用 该 API 储存用户首选的摄像头 有一些 App 支持用户更改摄像头 而另一些 App 则坚持 使用一种 不提供更换方法 这个 API 让 App 可以在 自动和手动相机选择间进行选择 FaceTime 通话、Code Scanner 和 WebKit 就是很好的例子 它们有不同的相机选择行为 来对应不同的需求 FaceTime 通话启动的时候 使用的是前置或外置摄像头 在通话期间 它又允许 用户在内置摄像头间切换 但在使用外置摄像头的时候 摄像头切换按钮就会隐藏 FaceTime 通话通过在切换设备时 设置 userPreferredCamera 以及接入外置设备时 观察 systemPreferredCamera 属性 来启用这个特性 它还可以自行决定什么时候适合使用 自动相机选择 API 举个例子 尽管你 可以在 FaceTime 视频通话中使用后置摄像头 但是在显示通话列表的主屏幕上 它总是使用前置或外置摄像头 控制中心提供的 Code Scanner 则和 FaceTime 通话行为不同 它启动时使用的是后置摄像头 并且不允许用户更改摄像头 但是它确实会监测 systemPreferredCamera 属性 并在收到通知后进行切换 WebKit 框架允许 网页访问 iPad 的摄像头 尽管它允许用户切换到任何摄像头 但是它返回的系统 首选摄像头是列表里的第一个 我已经向大家展示了 自动相机选择的工作机制 我要在 AVCam 中添加对它的支持 AVCam 是一款传统的影像 App 你可以用它来拍摄照片 录制视频 它和 FaceTime 通话 及 Code Scanner 不同 这两者分别是通信和实用性 App 而 WebKit 是一个系统框架 现在 AVCam 不再需要 一系列的“if、else if”语句 来查找带有回退功能的外置摄像头 它只需一行代码就可 获取系统的首选摄像头 由于这是第一次 App 使用自动相机选择 API 系统会返回内置前置摄像头 但是 AVCam 倾向于 先启动后置摄像头 在获取系统首选摄像头前 App 通过查找储存在 用户默认设置中的值 来检查这是否是 第一次查询这个摄像头 如果没有储存值的话 那么 App 还没有设置 自动相机选择的初始状态 因此如果 App 是第一次启动的话 App 会把用户首选的 摄像头设置为后置设备 App 用 AVCaptureDeviceDiscoverySession 找到后置摄像头 它使用提供的设备类型 对设备列表进行分类 然后设置用户首选摄像头 并在用户偏好设置中储存一个值 这样只需要进行一次设置即可 处理外置摄像头的连接和断开问题 不需要再监测 特定摄像头的连接状态了 取而代之的是 AVCam 键值观察系统首选摄像头属性 这种方法让 App 能够 自动切换到最佳可用摄像头 在 KVO 处理过程中 App 获取新的系统 首选摄像头并切换至这个摄像头 但是如果说 AVCam 正在录制呢? App 不应该切换摄像头中断录制 所以 App 只有在 非录制状态才能切换摄像头 视频录制结束后 App 就会查询系统首选摄像头 检查是否和当前 使用的摄像头不一样 如果系统首选摄像头的确变了 App 就会切换至这个摄像头 这样的话就不会中断录制 类似这些决策是你采用外置摄像头 和自动相机选择 API 时 必须要经历的步骤 执行对 App 最有利的操作 AVCam 有一个切换 摄像头按钮 能在前置后置设备间 切换 这台 iPad Pro 有多个摄像头 前置、后置都可以使用 所以 AVCam 有一定的逻辑决定 在一个给定的位置使用哪个摄像头 App 支持外置摄像头后 按钮应该如何运作呢? 我选择把外置摄像头 视作前置摄像头 Apple Studio Display 的 摄像头正对着我 就和 iPad 的内置前置摄像头一样 如果 changeCamera 函数 没有特定设备进行切换 App 就会检查当前设备的位置 在检查当前设备位置的切换语句中 如果当前使用的是未指定位置的 摄像头或前置摄像头 App 就会查找后置摄像头 外置摄像头报告它们的位置未指定 App 如果使用的是后置摄像头 就会切换到外置设备 如果有可用外置设备的话 不然就会切换到内置前置摄像头 为了查找外置摄像头 App 使用外置设备类型、 视频媒体类型和未指定设备位置 创建了一个 AVCaptureDeviceDiscoverySession
在切换语句中 当当前设备位置返回时 App 会首先查找外置摄像头 如果没找到的话 就会切换至内置前置摄像头 然后如果 App 查找到了想用的摄像头 就会通过在 AVCaptureDevice 上 设置 userPreferredCamera 类属性 来向系统反馈选择的摄像头 设置这个属性可以让 系统了解用户的偏好 你可以选择 App 如何支持外置摄像头 以及允许用户如何在摄像头间切换 就 AVCam 而言 我选择把外置摄像头 视作前置摄像头 让用户在 前置、后置和外置摄像头间切换 这样的话 摄像头切换按钮 只需要在两种设备间切换 AVCam 已经准备支持外置摄像头了 只需要再处理一个问题 这段时间我一直在使用 AVCam 这台 iPad 是横向放置的 USB-C 端口在右侧 如果我旋转这台 iPad 外置摄像头预览就会颠倒过来
但是显示器的 外置摄像头并没有移动 只有 iPad 移动了
但是 AVCam 使用内置摄像头 就没有这个旋转问题 这是因为外置摄像头的 位置是独立于 iPad 的 App 不知道如何定位外置摄像头 AVCam 需要进一步修改 以正确显示外置摄像头的视频预览 下面我再说明一下 为什么视频旋转很重要 这样实时预览和拍摄的 照片和视频才能正确显示 视频旋转对相机 App 来说不是一个新概念 外置摄像头是独立于 iPad 移动的 知道这一点很重要 App 习惯使用内置摄像头 正因为如此 它们根据 iPad 的方向 来旋转摄像头视频的方向并使用 AVCaptureVideoOrientation 枚举 这就是 AVCam 在刚才演示中的操作 它尝试旋转外置摄像头 来匹配 iPad 的方向 在 iPadOS 17 中 AVCaptureVideoOrientation 以及 使用该枚举的 API 都已弃用 AVCaptureVideoOrientation 描述 iPad 的方向 并假定摄像头会随着设备旋转 外置摄像头是独立于设备移动的 它的表达力不够表达 外置摄像头的方向 要使用这个枚举 App 通常会 转换 UIDeviceOrientation 它也描述了 iPad 的方向 是用于确定摄像头方向的间接信号 所以我们引入了新 API 来解决视频旋转问题 包括 iPadOS 在内的所有平台都新增了 AVCaptureDeviceRotationCoordinator 类 来帮助正确确定任何摄像头的方向 该类的初始化定式 需要一个 AVCaptureDevice 和可以选择显示摄像头 视频预览的 CALayer App 通常使用 AVCaptureVideoPreviewLayer 或 AVSampleBufferDisplayLayer 来显示摄像头预览 这两种都是 CALayer 的子类 且能够传递到初始化定式 使用 Metal 技术 或其他渲染方法的 App 可以直接在显示摄像头预览的 UIView 层执行渲染 协调器有两个属性: 用于水平预览的视频旋转角度 以及用于水平捕获的单独角度 这两个属性都是只读属性 以度为单位返回角度 并且返回的角度是键值观察属性的
水平预览和捕获内容意味着 不管设备是纵向、横向还是倒置 摄像头拍摄的视频框架 相对于重力来说总是竖直的
使用 videoRotationAngleForHorizonLevelPreview 显示传递到协调器的初始化 定式的 CALayer 中的视频框架 它描述了为预览而使用的旋转角度 这个角度是相对于 UIKit 和 SwiftUI 坐标系来说的
videoRotationAngleForHorizonLevelCapture 允许你的 App 拍摄照片及视频 以便日后查看时始终保持竖直 这个属性描述了摄像头的物理角度 并且它的值可能和 用于预览的角度值不同 这两种属性有不同的用途 为了解释视频旋转 我先从使用内置摄像头时 你熟悉的场景开始 稍后我修改 AVCam 的时候 再解释这些概念 如何应用于外置摄像头 iPhone 的相机 App 就是一个 描述水平预览和捕获的 视频旋转角度差异的很好的例子 在这个显示后置摄像头 预览的 App 例子中 iPhone 是竖屏的 UIKit 坐标系的原点 位于绘制区域的左上方 x 轴正向向右延伸 y 轴正向向下延伸 后置摄像头传感器的 坐标系原点不同 摄像头传感器 先沿着手机的高度扫描 再沿着宽度扫描 考虑到摄像头的物理方向 App 会把摄像头视频框架 旋转 90 度 以便在 UI 中预览 App 还会旋转拍摄的照片和视频 以便在日后观看时保持竖直 iPhone 横屏的话情况就不一样了 不管设备是什么方向 App 都只会纵向显示 UI 你可以根据主页 启示指示器的位置来分辨 对于 iPhone 上的相机 App 原点总是在有端口的那一侧 UIKit 坐标系的原点 仍然在绘制区域的左上方 在这个例子中 它固定在了设备的一个位置 因为 App 的 UI 只支持一个方向 后置摄像头传感器的 坐标系和 UI 的也不同 因为 App 只纵向显示 UI 因此不管 iPhone 是什么方向 预览时会固定旋转 90 度 但和预览不同的是 iPhone 横屏拍摄 照片和视频时 App 会采用不同的旋转角度 当 iPhone 处于 摄像头传感器的原生方向时 App 不需要旋转照片或视频 它们就可以竖直显示 这些旋转问题让人头晕目眩 还好 AVCaptureDeviceRotationCoordinator 处理了这种复杂性 并提供了正确的角度来预览 和拍摄来自所有摄像头的内容 依靠它提供角度 而不是自己试图计算角度 App 切换摄像头的时候 务必创建一个新的旋转协调器 要使用视频旋转 在 AVCaptureConnection 上使用 由协调器用新 API 提供的角度 只有传输视频或深度 媒体数据的连接才支持旋转 要检查连接是否支持角度 你可以调用 isVideoRotationAngleSupported 方法 要让连接执行旋转 我们要给 videoRotationAngle 属性 设置一个受支持的值 使用 videoRotationAngleForHorizonLevelPreview 来显示摄像头预览 使用 AVCaptureVideoPreviewLayer 的 App 可以把这个属性的值 应用到 AVCaptureConnection 实例的 videoRotationAngle 属性上 App 也可以用它在 CALayer 中 显示来自视频数据输出的缓冲区 为了与系统动画同步 我们需要立即在 App 的键值观察 代码中更改预览旋转 你的 App 可以在 主队列上收到这个属性的更新 来更新 UI 不是所有 App 都使用 AVCaptureVideoPreviewLayer 来显示摄像头预览 一些 App 使用自定义效果或滤镜时 显示视频数据输出的缓冲区 显示自定义预览的一个选择是使用 AVSampleBufferDisplayLayer 通过在视频数据输出的 AVCaptureConnection 上 设置角度来避免旋转 改变连接角度会导致帧传输中断 因为捕获渲染管线会自己重新配置 来启用新的旋转角度 相反 在显示 摄像头预览时旋转 CALayer 这样可以让 App 的 摄像头预览顺滑地旋转 使用 videoRotationAngleForHorizonLevelCapture 拍摄照片和视频 这样它们就能相对于重力保持水平 你的 App 可以把 捕获连接上的属性值 应用到照片或视频文件输出上 或者 如果你的 App 使用带有 AVAssetWriter 的 视频数据输出来录制自定义视频 请避免使用 AVCaptureConnection 旋转视频 相反 使用 AVAssetWriterInput 实例的 变换属性设置旋转 这会改变输出文件的元数据 使用这种方法 视频 App 在回放过程中使用旋转 这比使用捕获连接 旋转每一帧图像消耗的功耗更少 你的 App 需要 转换旋转角度的度数 因为资产编写器输入 使用 CGAffineTransform 它使用的是以弧度为单位的旋转 有一些输出可以高效地 应用旋转 而不增加功耗 比如 视频文件输出使用 QuickTime 跟踪矩阵进行旋转 照片输出使用 Exif 标签处理方向 而预览层转换其他内容执行旋转 但是如果让视频或 深度数据输出执行旋转 App 可能会增加设备的功耗 因为旋转缓冲区 要消耗更多的内存和功耗 相反 你的 App 可以采用一种更高效的方式 那就是旋转预览视频或 深度输出缓冲区的 CALayer
在所有可用平台上使用 AVCaptureDeviceRotationCoordinator 包括 iOS、Apple tvOS 和 macOS Mac Catalyst 和 Mac 上的 iOS App 也可以使用 你的 App 可以使用旋转协调器 正确调整照片或视频的方向 并显示任何摄像头的视频预览 而且它还可以使用台前调度 或在处于外置显示器时 帮你的 App 处理复杂的布局 是时候做出最后的更改 让 AVCam 支持外置摄像头了 配置采集会话时 App 会设置它的摄像头预览 因此会创建一个设备旋转协调器 给 App 提供预览 和采集所需的旋转角度 创建协调器时 App 会使用当前的旋转角度 更新预览层进行预览 App 也会观察 角度的变化来更新预览
AVCam 切换设备时 也会创建新的旋转协调器 这样预览就会适配新的摄像头
拍摄照片时 App 使用 旋转角度进行采集 确保日后有人查看时保持竖直 录制视频也是一样 做了这些更改后 AVCam 可以支持外置摄像头了 现在我旋转 iPad 外置摄像头就正确显示了
我们在本次讲座中学习了很多内容 也感谢大家的观看 我已经给大家介绍了 iPad App 如何使用外置摄像头 下面再介绍一下如何 使用这些设备所带的麦克风 有一些网络摄像头 和显示器带有麦克风 它们接入 iPad 时 你的 App 就可以使用这些麦克风 iPadOS 17 改进了对带有 USB-C 端口的 iPad 外置麦克风的支持 使用 Core Audio 的 AUVoiceIO 音频单元的通讯 App 现在可以使用外置麦克风 比如网络摄像头或显示器附带的麦克风 之前 App 支持使用的 唯一外置有线设备 是头显设备麦克风 AUVoiceIO 是一种流行的端口 因为它可以进行回声消除 并为外置麦克风引入新的调音 控制中心提供的语音隔离模式 可以消除不受欢迎的背景噪声 比如键盘敲击声、 鼠标点击声或风机在附近运行的声音 你的 App 可以使用 外置麦克风和这个系统功能 iOS 音频路由系统 仅支持一次使用一个麦克风 并且会自动更换到 最后连接的麦克风 这是因为 和连接摄像头一样 用户在指示使用最新连接的麦克风 在 iOS 上 系统只返回 一个麦克风的 AVCaptureDevice 你可以通过搜索音频媒体类型的设备 或弃用 builtInMicrophone 的新 麦克风设备类型来找到它 因为不是所有麦克风 都是内置在 iPad 里的 音频路由系统 决定使用哪个可用麦克风 是内置还是外置 系统改变输入路径的时候 麦克风 AVCaptureDevice 的 localizedName 属性会发生更改 来反映使用中的设备 你可以使用 AVAudioSession 获得更多对麦克风的控制 你可以使用它通过设置类别或模式 配置 App 的音频行为 并且你可以通过设置偏好输入 选择使用某个特定的麦克风 比如外置摄像头附带的麦克风 本次讲座的最后一个话题 我会谈谈 App 使用 外置摄像头的最佳做法 使用前请考虑一下 什么对你的 App 是最有利的 早前 我展示了 FaceTime 通话、Code Scanner 和 WebKit 是如何以 不同的方式支持外置摄像头 以它们为例 你的 App 可以采用不同的方式 外置摄像头使用 USB-C 端口时 用 Xcode 配置你的 iPad 进行无线调试 App 从内置摄像头获取的某些功能 可能不受外置设备的支持 举个例子 如果你的 App 依赖深度数据采集来实现某些功能 那么在使用外置摄像头时 可能需要禁用它 通过 AVCaptureMultiCamSession 同时使用多个摄像头的 App 可以添加外置摄像头 进行创意性采集设置 iPadOS 对外置摄像头的一些处理 也适用于前置摄像头 AVCaptureVideoPreviewLayer 默认镜像外置摄像头 摄像头正对 iPad 用户时 它就非常有用 但是不适用于所有情况 如果 App 用户通过 HDMI 切换器进行流式传输 或者远离外置摄像头 考虑允许用户禁用预览镜像 我在上一部分介绍了摄像头旋转 虽然你的 App 可能不需要 使用外置摄像头的视频旋转 请注意如果需要的话 系统会顺时针旋转外置摄像头 使其朝向面前的情景 内置摄像头也采用了 同样的旋转方式
配置好你的 App 以处理不同功能的摄像头 比如 有些外置摄像头 可能只支持两种格式 如 640x480 的 VGA 格式 和 1280x720 的 HD 格式 有些外置摄像头支持 不常用于 iOS 的像素格式 我们选择把这些格式转换为 iOS 习惯处理的 更常见格式 将 yuvs 和 2vuy 等 未压缩格式转换为 420v 将流式传输 JPEG 和 H264 等 压缩格式转换为 420f 因为外置摄像头 可以支持任何大小的格式 它可能不支持所有的 AVCaptureSessionPresets 例如 HD 4K 预设 要求设备支持兼容格式 你的 App 可以通过调用 AVCaptureDevice 的 supportsSessionPreset 方法 来检查设备是否可以使用预设 你的 App 可以配置外置摄像头 包括更改分辨率、帧率和缩放系数 iPadOS 支持一组有限的 USB 视频类规范 提供的摄像头控制 所以要查询 AVCaptureDevice 的功能 我们来总结一下刚才的内容 我向大家介绍了 如何发现和使用外置摄像头 如何正确旋转摄像头的视频框架 如何使用外置麦克风 最后介绍了 App 的最佳做法 非常期待看到你的 iPad App 支持使用外置摄像头 感谢观看 希望你的 App 大受欢迎 ♪ ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。