大多数浏览器和
Developer App 均支持流媒体播放。
-
利用 AVKit 实现直观的媒体播放
AVKit 是一个用于构建媒体用户界面的高级框架,包括播放控件、分集导航、画中画、音频路由、字幕与隐藏式字幕支持、Siri 与正在播放功能整合,以及对键盘、触控栏和遥控器的支持。了解如何在您的 iOS 和 Apple TVOS app 以及适用 Mac 的 iPad app 中整合这些技术的最佳做法。
资源
相关视频
WWDC21
WWDC20
WWDC19
-
下载
欢迎来到 Delivering Intuitive Media Playback with AVKit 我叫 Jed Lewison 过会儿我的同事 Dan Wright 也会上台 我们将向大家介绍的是 使用 AVKit 进行媒体播放 以及在 iOS 和 tvOS 环境下 AVPlayerViewController 有哪些 最新功能和最佳实践
AVKit 是一种跨平台媒体播放 UI 框架 它是基于 CoreMedia 和 AVFoundation 建立的 我们的目标是 让你轻松地显示和播放 基于 AVPlayer 的媒体内容 使用的用户界面与 Apple 自带 App 相同
对于 UIKit App 我们提供 AVPlayerViewController
对于 APKit App 我们提供 AVPlayerView 对于适用 UIKit 或 APKit 的所有 App 我们提供 AVRoutePickerView 它允许你 添加无线路由选择器 到自定义播放 UI
那么让我们来看看代码 在 iOS 上开始使用 AVPlayerViewController 其实非常简单 在 tvOS 上也是一样 你要做的第一件事就是 创建一个 AVPlayer
然后你创建一个 AVPlayerViewController 并把它分配到你刚刚创建的 播放器里 最后 把它显示出来 这就是要做到全部内容了 以上就是得到一个 内容丰富且功能齐全的 媒体播放 UI 所需要做的 你的用户会对它很熟悉 因为它与 Apple 在 App 中 使用的 UI 相同 不过在这简单的表面之下 蕴含有非常强大的功能 这是因为当你 使用 AVKit 时 你掌控着媒体播放对象 你可以创建 并管理它们 而视频渲染也是采用 与 AVPlayerLayer 相同的 核心技术 这意味着你可以获得 AVFoundation 和 CoreMedia 播放 UI 的全部功能 包括 AVPlayer AVPlayerItem 和 AVAsset 提供的所有功能 但由于 AVKit 也基于 UIKit 和 AppKit 因此你能获得 为 Apple 这些独一无二的平台 所量身定制的用户体验 所以 AVKit 为你提供了两全其美的体验
你可以全方位控制 媒体播放对象 以及一个可以显示和播放这些对象的 API 使用基于 UIKit 和 APKit 的 API
所以 以上是对 AVKit 高度概括的介绍 接下来 让我们深入了解 iOS 环境下的 AVPlayerViewController 在 iOS 13 中的新功能 我先来介绍一下 我们新添加的全屏回调函数 它能够告知你从嵌入式内联 演示到 全屏的过渡 以及进入全屏和退出全屏 所以 为了给大家演示 在下面的视频中 我们将看到的是 用户进入全屏模式 然后进行 小窗模式 不过 用户会半途取消小窗模式 所以现在我们又回到了全屏模式 现在用户已经退出了全屏 我们就回到了最初的 AVPlayerViewController 内嵌在文本中的地方 所以 我们在 iOS 13 中 提供的新的 API 通过扩展 AVPlayerViewControllerDelegate 来告知你所有这些状态
全屏演示开始 或结束时 你会得到通知 它看起来是这样的
两个新的代理方法 如果你链接到 iOS 13 的 SDK 这个从 iOS 12 开始 可以获得 一个用于开始全屏演示 另一个 用于在全屏演示结束时 调用 那么让我们来看看 这里是怎么执行的 这里的关键对象是 UIViewControllerTransitionCoordinator 它与 UIKit 中任一其他 视图控制器转换的工作方式 完全相同 你可以了解所有这些 细节和功能 从 UIKit 文档中 不过我在这里想要 强调的一个重点是 animate 方法 alongsideTransition 回调函数的完成处理器 通过它你能够知道 一个过渡是否成功了 或者用户是否取消了它 通过它才能知道从文本演示 进入全屏模式的 真实情况
很显然人们有兴趣知道 播放器视图控制器是 处于全屏状态 还是嵌入在文本里 但为什么这很重要呢 它很重要是因为 我们来举例说明 当你的播放器视图控制器 处在滚动视图中 然后用户进入了全屏模式 当设备旋转的时候 你知道 有时你的滚动视图 会有偏移 而且有可能 播放器视图控制器 会滚动至屏幕外 当然在全屏演示时 它滚到屏幕外是没问题的 因为用户看不到它 但是你需要确保 播放器视图控制器是开启的状态 如果它被释放关闭了 全屏演示也将结束 所以你可以使用新的 API 来了解何时 该对播放器视图控制器进行强引用 如果遇到表视图控制器 或集合视图 碰巧移除了 在屏幕外滚动的播放器视图控制器的情况 不过还有一个未解难题 就是当用户退出全屏后 你如何把它 归回原位 解决办法是 你可以使用 新 API 的 willEnd 变量 而且要在动画开始前 进行调出 这样你才能在 UI 中 重新设置播放器视图控制器 的位置 而用户对这一切将一无所知 一切都会按照他们期待的那样复原 所以这就是全屏回调了
现在我们来看一下 Mac 系统下 iPad App 中的 AVPlayerViewController 如你所知 iPad 的 App 现在可以在 Mac 中构建 AVPlayerViewController 在这一过程中 全面发挥作用
它看起来就像这个样子 你可以获得与 Apple 的 播放 UI 相同的用户界面 包括 AVPlayerViewController 为 iPad App 提供的 所有功能 但同时你也能得到一些 Mac 平台的特别功能 比如触控栏支持 这个是免费的
还有键盘支持功能
此外我们也加入了 画中画支持
也是对于 Mac 上的 iPad App 事实上 我们对于 所有基于 UIKit 和 AppKit 的 App 都扩展了画中画的支持 在这次发布中
那么在 Mac 上构建 iPad App 使用 AVPlayerViewController 需要用到多少行 新代码呢 你们猜对了 零
以上就是 AVPlayerViewController 以及在 Mac 中构建 iPad App 现在让我们来谈谈外部元数据 作为演示 想象你正在投屏一些内容 在这个时候 你锁住的屏幕看起来是这样的 而不是这样的 需要做两件事 才有可能出现这样的用户界面 第一 你需要处理 远程控制命令 而 AVKit 能够自动且免费地 为你处理 你什么都不用做 但是有些时候 你的媒体 缺乏你想要发布的 完整的 全部元数据 对于这种情况 我们在 iOS 中添加了新 API 它其实在 tvOS 中早已存在 输入你的 AVPlayerItem 然后你可以对元数据进行补充 比如标题 元数据 图案元数据 超级简单的 当你这么做的时候 我们会帮你解决其他所有问题 在 iOS 13 中 我们还改进了 对于互动的支持 对于 AVPlayerViewController 中的 自定义控件的支持 这个之前就可以实现 只要使用 iOS 中 AVPlayerViewController 的自定义控件就行 不过当你这么做的时候 你会丢失所有其他 不在屏幕上的内容 比如互动式小窗 或者横屏支持 再比如键盘 还有在 Mac 中构建 iPad App 时 用到的 AVPlayerViewController 触控栏支持 那么现在在 iOS 13 环境下你能做的就是 如果把 showsPlaybackControls 设成 False 那么你就以模块的方式显示 AVPlayerViewController
最后使用 contentOverlayView 来放置 你的自定义控件 你可以拥有一个完全自定义的 播放 UI 的同时 使用诸如 现在播放支持 以及小窗播放支持 不过如果你这么做的话 有些注意事项 你要记住 你仍然需要注意状态栏 以及底部横条 的外观 并且你应该一直将 未处理的触摸手势 通过视图层次结构传递下去 以便让 AVKit 处理例如 小窗播放或双击放大等类似的事情 这些内容我们稍后再讨论
好的 我们来看看在 iOS 中的 AVPlayerViewController 有哪些新功能 我们新增了不少新内容 其中一项就是我们 在改进 iOS 12 中的性能方面 突飞猛进 它在 iOS 13 中更是表现抢眼 所以如果你对在滚动视图中 使用 AVPlayerViewController 感兴趣的话 改进后的它就像 黄油般流畅丝滑
那么 让我们来聊聊 AVPlayerViewController 的 最佳实践
我想谈三种不同的 在设备上播放视频的方式 当然了 也有第四种 播放视频的方式 那就是从一个 iOS 设备上投屏 周二早上 9 点 有一场精彩讲座 如果你没到场 我强烈建议你观看相关视频 不过今天我的重点还是放在 设备播放上面
让我们从全屏视频播放开始 当然了 我的意思是说 基于 UIKit 意义的全屏 所以 我们讨论的是 覆盖你的 UIWindowScene 坐标空间 如果我们细想一下 可能存在两个原因 促使我们全屏播放一个视频 它可能是一种 在开屏时的 背景视频 或者这个视频是 展示的亮点 我们因此想要对其进行完全的播放控制 我们来快速看一看 开屏这种情况 这些是你想要 在 App 里实现的 为了达到这一目标 你需要 选择 playerViewController 你需要把它作为子内容去嵌入 因此它可以位于 视图层次结构的底部 你还需要做一些设定 比如禁用播放控件和 合理设置 videoGravity 以便让视频缩放到 填满整个屏幕的大小 如果你打算用这次新发布的 带有 alpha 通道 API 的新视频 你需要将你的 视图背景颜色 设定为 clear 或其他颜色以衬托重点
关于 AVFoundation 也有一些事项 需要考虑 你肯定希望确保避免 开屏的内容 作为外部播放来播放 因为你不想干扰 比如说 别人 Apple TV 上的 音乐播放 此外你也想要配置音频会话 尤其是 AVAudioSession 的 最后一个属性 这个辅助音频应该被静音 如果用户在其他的 App 上播放音频 它就会通知你 他们希望那个 App 成为 那个音频成为主要 在这种情况下 如果你的 开屏视频中有音频 请确保将其静音 然后我们来看看 当视频作为展示亮点的情况下 的全屏播放 在这种情况下 当然 我们想要播放 UI 能够 完美地适应 无论是像这样的纵向展示 此时我们看到的是 堆叠的播放传输控件 还是在横向展示的情况下 我们需要一个略有不同的布局 但是同样的 但我们需要 提供相同的功能 那么 AVPlayerViewController 能为你免费实现这些 同时它还能做到其他一些事情 你会注意到 在刚才的两个屏幕截图中 在纵向展示时 视频是没有被缩放调整的 而在横向展示时 它是被缩放调整了的 而且它被调整成填充满了整个屏幕 因为在这种情况下 用户 播放的视频的纵横比 与设备的纵横比是相似的 视频以缩放格式播放 不过有些用户更喜欢 不去缩放调整视频 就像这里 当发生这种情况时 我们希望确保视频不会 被设备的任何物理特性遮挡 AVKit 注意到了这些细节 并在你使用 PlayerViewController 时 进行相应的处理 相比起逐一介绍我们提供的 每一个新功能 我只想放大强调两个 非常小的细节 是我们新增在 iOS 13 系统下的 第一个 在这个视频中 你将听到音频播放 然后用户将点击静音按钮 当它静音时请注意 音频有一个微妙的下降 在音量滑块中有动画出现
然后在这个示例中 有一个小窗播放 请注意 音频是随着用户的缩小 柔和地逐渐消失的 然后当用户取消小窗 音频的音量又恢复了 所以上述就是这两个小细节了 事虽小 但它们证明了 我们对 AVPlayerViewController 各方面细节 重视程度之高 如果你将它放进你的 APP 用户将能够免费使用它
除此之外你还会得到很多其他的东西 你可能会问的问题是 如何获得所有这些 让我们再看一下代码
你看 这与我之前在演讲中 展示的内容基本相同 唯一需要补充的是这个 外部元数据 这行代码允许你 对元数据进行补充 而且它真的就这么容易上手
但值得一提的是 为什么你可以在 UI 方面 几乎什么都不做 就能获得 如此好的体验 所以 为此我想谈谈 这里的几个最佳实践 当你使用 AVPlayerViewController 进行全屏演示时 你应该始终 以模态方式呈现它 而不是 作为其他视图控件的子视图控件 有时你可能已经这样做了 因为你想了解 呈现状态 现在你可以用我之前讨论过的回调函数来处理 以模态方式呈现让我们 可以处理状态栏可见性等 让我们来优化屏幕的 显示模式 它允许我们处理视频的对齐方式 视频缩放模式小窗播放 当你以模态呈现全屏时 你应该使用 默认的模式演示样式 你也许知道 在 iOS 13 中 新的默认模式演示样式 是自动的 AVPlayerViewController 对此的处理是 全屏演示
这里有两种 全屏演示 全屏和超全屏 想要使用默认模式的原因是 因为当你 呈现视图控件时 UIKit 是可以删除呈现的 视图的 这是因为你的 视图覆盖了新呈现的 视图层次结构 所以 删除呈现视图是 对旋转时进行的优化处理 你不会想对视频重新布局 当视图甚至都不可见的情况下 不过 它也允许像横向播放 这类的事情发生 如果你的 App 是仅为纵向视图 或者此视图控件的层次结构 仅为纵向
最好对视频对齐方式属性 进行保留 以便进行全屏播放 这样我们就可以像 我之前说明的那样 进行自适应行为 如果你设置了视频对齐方式属性 我们会准确地为你提供所需内容 我们可以缩放视频 或取消缩放 不过一旦你这样做了 我们就不能 再做其他自适应行为了 因此 用户通常是 更愿意拥有 自适应行为 当然 还有使用新的 代理方法来 跟踪全屏显示状态
这里有一些与 AVFoundation 最佳实践相关的技巧 这是什么意思呢 我对它的理解是 如果你正要播放一段视频 比如从视频的一半开始放 应该把播放器中的播放项目 放到继续播放的时间位置 并确保你的播放器 已经处于播放状态 然后将它提供给 AVPlayerViewController 这会使 UI 看起来很正确 更重要的是 它避免了 加载最终不会被播放的内容
你还应始终注意 AVPlayer 和 AVPlayerItem 的状态属性 虽然你可以使用 KVO 来观察它们 当它们 fail 时 当属性状态变成 fail 时 在许多情况下 都有一个 简单的恢复办法 检查错误属性 查看媒体服务是否已重置 如果是这样 只需重建你的 播放器 播放项目 你的 AVFoundation 对象引用 并在 PlayerViewController 上 将其设置回去 一切都应该没问题了 此属性为你提供了一个 优化过的视频渲染 当你在进行镜像的时候 当然 始终配置 播放时的音频会话 因此 当我们讨论文本中 嵌入 AVPlayerViewController 时 还需要考虑一些问题 我们已经讨论了 00:18:25.356 --> 00:18:28.466 A:middle 在 iOS 13 中新的
全屏演示状态回调 所以我不会再重复了 但是 我想要提醒的一件事是 如果你过去使用过 AVPlayerViewController 当我们从嵌入式演示 进入全屏时 模态转换风格 为超全屏风格 这意味着你的视图 你正在呈现的视图 不会被移除 如果你的 App 链接到 iOS 13 则现在默认的演示样式 将会是全屏显示 这意味着呈现视图 可能会被移除 这就是我之前谈到的 所有优点了 因此 理想状态下 你可以将此模态呈现风格 定为全屏 但如果你不这样做 也没关系 你仍然可以将它 设置为超全屏 不过我的建议是 最好跟着默认设置走
另一件需要考虑的事情是 当你有一个嵌入式演示 你的视频 你可能想要缩放视频 这样就不会在 顶部或底部出现黑条 你还可能希望将 给视频的播放窗口 设置 cornerCurve 而且 你可能想要 设置视图的背景颜色 你可以在 AVPlayerViewController 的视图中设置 或者赋予视频对齐方式 当它被嵌入文本的时候 我们将把它用于 演示的嵌入部分 如果用户决定全屏显示 那么我们就在那里进行设置 因此 相比之下 如果你只是 全屏呈现 AVPlayerViewController 那么你可以 更改演示嵌入部分的这些属性 完全没问题
我们还有几个属性 这些属性可以 在你有内嵌演示时 提供自适应行为 这样你就可以做一些事情 比如 用户点击一个 大的播放按钮 PlayerViewController 将 PlayerViewController 的内容将 将自动进入全屏 同样地 在视频结束时 它将退出全屏 对我们来说 最好是能代你处理 这些事情 因为例如 假设用户 正拖动到视频的末尾 那么 播放时间将是处在 视频的末尾 但你不想 在那个时候关掉视频 因为用户可能 只是在随便看看 我们会跟踪 用户的行为 只有在合适的时候 我们才会退出
当然了 你总是希望采用 UIViewController 控制 API 它看起来像这样
要记住的另一件事是 如果你有很多 要浏览的视频 你可能会觉得 海报视图是个好主意 这样可以显示视频的一帧画面 而无需把视频全部下载 这可能需要一点时间 你可以使用 AVPlayerViewController 中的 contentOverlayView 来解决 然后你就想知道 什么时候视频 什么时候视频的第一帧准备就绪 这样你就可以删除 刚刚放在叠加视图中的内容
你可以通过 在 AVPlayerViewController 上观察 isReadyForDisplay 来做到这一点 这个属性使你可以通过 KVO 来进行观察 这就是观察时 的代码的样子 你会希望获取 初始值 因为视频的那一帧可能已经被渲染了
最后我想谈一点 有关画中画的内容 将它加到你的 App 中非常容易 AVPlayerViewController 可以 为你解决大部分的麻烦 你必须对 App 进行配置 以支持画中画 它看起来像这样 只需单击 Xcode 中的复选框即可
有一点 无论你使用的是 AVPictureInPictureController 还是 AVPlayerViewController 这都适用 当用户在 iPad 上向上滑动回到桌面 画中画可能会 自动启动 这意味着当你的 App 进入后台时 你不应该 暂停任何正在播放的视频 因为画中画 可能刚刚开始 你不会想暂停 用户可能仍然在观看 的视频 所以 不要暂停 并且 AVFoundation 将为你 解决此问题 但是如果你必须暂停 你起码应该等待 App 的后台状态 App 状态 窗口场景的状态达到后台 来看看你该怎么做
你可以对状态进行跟踪 看看你是在画中画状态中 还是要离开画中画状态 使用 AVPlayerViewControllerDelegate 就可以
而且可以一直切换 画中画的播放
请做好准备 你的视图控件 会在在画中画开始时 关闭 与全屏情况不同 我们将在 画中画状态激活时 阻止 AVPlayerViewController
释放关闭 但是如果视图控件 被解除 那么当用户 想要返回到 App 时 你将需要恢复 UI 所以 做起来真的不难 这是你要获得的 回调函数 即 AVPlayerViewControllerDelegate 在这里 你所要做的 就是让你的用户界面恢复到 一个你想要的 能运行的状态 在这种情况下 我们 只是再次呈现视图控件而已 然后 当你准备好时 调用 completionHandler 传递给回调函数 让我们知道你已经准备好了 我们将通过动画 回到原位 你需要相当快速地操作 否则 画中画窗口可能 就出问题了 并且你的用户 也看不到画中画功能 他们无法回到 你的 App
那么 以上就是对 iOS 中 AVPlayerViewController 的 最佳实践的新功能简要介绍 在我们的会议网站上 有说明这些概念的 所有示例代码 现在 我想把时间 交给我的同事 Dan Wright
好的 让我们来谈谈 Apple TV 上的 视频播放
在 tvOS 上 AVPlayerViewController 支持全屏交互式播放 带有用于导航 信息 和设置的 标准控件
内置对升级版 Siri 的支持功能 例如 “她说了什么?” 正在播放媒体信息的出版信息 插播式广告 内容摘要等等
那么 tvOS 13 有哪些新东西呢
从去年开始 我们已经升级了 控件的外观 从 tvOS 12.3 开始 引入了精细的精确滑动
今天我们将介绍 自定义交互式叠层 流直播的频道切换 以及对家长控制内容 的自动执行
高精度的滑动让你 可以更轻松地使用 Siri 遥控器 来找到你正在寻找的 视频中的精确时刻
PlayerViewController 一直都支持 在 PlayerViewController 中 进行滑动 可以让你轻松快速地 找到在一大段视频中想要的位置 但是现在 精细滑动可以让你 在试图定位时 更容易找到一个 非常精确的时刻 哪怕是在一秒的时间长度内找寻
当然信息视图有一个 新的外观来匹配 TV App
自定义交互式叠层 支持 App 控件 通常 自定义叠层 是隐藏起来的
屏幕上的提示会 引导用户向上滑动 以显示叠层 叠层是 完全交互式的 它可以包含 按钮 收藏 或其他任何 你喜欢的 由视图控件定义的交互式元素 然后 对于 持久化的非交互式元素 例如频道的标识 你也应该继续 使用 contentOverlayView 让我们看看自定义叠层 是什么样的 当视频开始时 会在底部 有一个提示 引导他们 去向上滑动 以获取更多信息 当他们向上滑动时 他们会看到 你的叠层 就像那样 他们可以通过向下滑动 或通过单击菜单按钮来解除
这样 你的视图控件就呈现出来了 你将得到所有常见的 UIViewController 通知 我们来处理解除动作和动画 你的用户可以在不同的 App 中 获得始终如一的体验 想要使用它 你只需要 要显示的内容 去定义视图控件即可 并在播放器视图控件上设置 customOverlayViewController 的属性
直播频道切换
频道切换适用于流直播 它支持在多个流直播之间 进行切换 例如 不同的频道 用户进行水平滑动 就可以转到下一个或上一个频道 并且频道的插页式屏幕 会在该频道加载时 提供对频道内容的描述 那么 让我们来看看频道切换 是什么样子的 当用户在频道间 滑动时 频道的插页式屏幕视图就会出现 这里有一个简单的绿色背景 一些文本和 一个加载指示器 这些完全处于你的 掌控之中 你可以把它们做成任何你 喜欢的样子 包括 图片 渐变背景 你自定义的微调器 随你喜欢 最重要的是让用户 清楚自己现在所在的位置 并知道他们要去哪儿
我要补充的另一件事是 这是一个 非交互式屏幕 它的目的就是引导用户 进入下一个频道 所以你不要指望 这里有控件 为支持频道切换 请扩展你的 AVPlayerViewControllerDelegate 以实现 playerViewController skipToNextChannel 和 skipToPreviousChannel
所有这些方法都是将 播放器视图控件中的内容 替换为新频道的内容 如果你愿意 可以等到内容准备就绪再播放
播放结束后 调用 completion 代码块 如果成功就返回 True 不然就返回 False
但无论你做什么 请确保最终调用 completion 块 因为这样做才会 消除频道的 插页式屏幕
现在还有两种补充方法 nextChannelInterstitialView Controller 以及 previousChannelInterstitialView Controller 这些方法负责提供 在不同频道之间显示的 视图控件
因此 你需要实例化 你的视图控件 如果你有 如果你需要 并用有关新频道的信息 来填充它
然后就返回 在这个例子中 我们 每次都要实例化一个 新的视图控件 但在许多情况下 你可能只需将它 实例化一次 然后重复使用它
tvOS 有内置支持 可使用密码或 通过设备配置文件 限制对内容的访问 设备配置文件通常 用于教室环境 或商业环境
在 tvOS 13 中 AVKit 提供自动支持 可帮助你的用户 重新获得对 受限制内容的控制 因此 要测试内容限制 进入设置 再进入限制
把它打开 提供并确认密码
然后更改电影或电视节目的 内容分级
在这里我们把它 更改为 PG-13
那么你需要做什么 才能在你的 App 中支持它 最重要的是 你需要在所有的内容中 明确规定媒体内容的评级 如果你的素材不含有这类信息 那你需要使用 AVPlayerItem 的 外部元数据属性 来添加它 而且你会想要使用 iTunes 元数据内容 分级标识符
你需要在播放开始时提供 此评级 以便 AVKit 能根据用户设置 来判断它 是否属于受限制的内容
而且在必要时 会在屏幕上要求输入密码
现在 如果内容受 密码限制 将提示用户输入密码
但是 如果内容受到设备配置文件 的限制 那它可能就完全不能播放 用户可能没有 别的选项
现在 AVPlayerViewController 将在播放开始时 自动请求访问你的内容 但你可以使用 一个新的 API 请求 播放限制授权 请求更早访问
当然 出现任何类型的失败 例如用户 不知道密码 或者不想输入密码 或者是设备配置文件 禁止访问内容 那么播放器视图控件 将自动被解除 最后如果你有 自定义播放用户界面 你还可以使用 上述 API 请求访问 限制内容 现在让我们来看看 用户在尝试播放受限内容时 会看到什么 现在 视频将进行加载 一旦它准备好播放 并且元数据可用 要求输入密码的屏幕 将立即出现 一旦用户输入密码 密码屏幕 就会被解除 视频开始播放 那么让我们来看看 如何提供媒体内容评级
这些元数据有时是 你的素材的一部分 但通常情况下 并非如此 因此你需要通过 AVPlayerItem 的 外部元数据属性 来提供给它 我们之前的演讲中 已经看到过这段代码 但是我们这里只有一个 辅助函数 它以字符串的形式获取我们的评级 并返回 AVMetadataItem 返回值是该字符串 扩展语言标记设置为 und 代表着未定义的意思 因为它不是任何特定语言
你的标识符是 iTunesMetadataContentRating
最后 一旦我们创建了它 在这个例子里 评级为 PG-13
我们将它添加到播放器项目的 外部元数据属性中 现在 如有必要 AVPlayerViewController 将自动进行提示 但是 假设你想要在 呈现播放器视图控件前 就提早进行提示 或者可能在更早的内容前提示 你可以使用 AVPlayerItem 中的 requestPlaybackRestrictionsAuthorization 这个 API 来完成操作 当请求完成时 将调用该闭包 以显示该请求结果是成功 还是失败 如果返回结果是失败 则会提供失败原因的相关信息 如果返回结果是成功 则会继续播放 否则你应该取消关闭 并返回菜单屏幕或其他操作 除非用户明确提出要求 否则不要继续尝试 播放内容
好了 让我们做一个简短的演示 仔细看看其中的一些应用
好了 这就是我们的简单示例 App
对于已经使用过 HLS 进行测试的人来说 这些视频可能看着很眼熟
这是向上滑动的效果 从底部向上滑动 可获得更多提示 如果向上滑动 就会获得 自定义叠层 你能看到 它实际上是有效的 我还可以向下滑动 它就消失了 我们还能做什么呢
好吧 如果我按下并保持手指下压 我们会看到 屏幕左侧和右侧的提示 这些箭头是在提示用户 可进行频道切换 如果我只是横向滑动 看看隔壁在说什么
采用一些伟大的设计模式 包括—— 它的底层使用了 一个列表展示—— 00:35:33.056 --> 00:35:34.976 A:middle 在上个月——
让我们看看 我们还有什么 是它吗 哦 这里发生了什么
好的 好了 这就是我们的简单示例 App
我在看我自己 让我们回去 让我们看看 00:35:58.916 --> 00:36:00.826 A:middle 回到
这是向上滑动的效果 从底部向上滑动 可获得更多提示
如果向上滑动 就会获得 自定义叠层 看看它是否真的有效 让我们暂停
好了 让我们花点时间来谈谈 tvOS 的一些最佳实践
你们中的一些人 已经在你的 App 中 设计了通过向上滑动显示的控件 通常 它是 Up Next 列表
一般来说 你是通过 在播放器视图或父视图上 安装自己的自定义向上滑动手势识别器 来实现此目的 然后你的视图控件就会出现 如果你正在这样做 那么我们希望你能转而使用 自定义的叠层
它会带给你 在未来有更好的兼容性 这是个暗示 并为用户在不同的 App 中 提供更好 更一致的的体验 如果你在菜单按钮上使用 UI 点击手势识别器 来检测是否解除播放器视图控件 或者在某些情况下 提供解除动画 那你应该选择使用 代理解除通知 来取代识别器 我们在 tvOS 11 中介绍过那些功能 它们应该为你提供 所需的所有信息 这一点非常重要 因为用户点击菜单按钮 不再是解除 播放视图控件 的唯一办法 它现在可以自动解除
我之前说过这事 但是不应该滥用 showsPlaybackControls 来强制立即改变 控件的可见性 showsPlaybackControls 的目的是 对播放器视图控件进行配置 以表明你是否 希望用户 可以访问 播放控件
为你所有的内容 提供媒体内容评级 当然了 还有 对启用家长内容限制的情况进行测试 大多数人都不会遇到问题 但你可能会发现 当出现密码流时 你正在做的事情 可能不能正常运行 例如 如果你在播放开始时 想显示一个几秒钟的提示 你肯定不希望密码 覆盖它 不然用户将 无法看到提示
总而言之 跨平台采用 AVPlayerViewController 你可以以非常低的成本 获得 iOS 和 tvOS 的强大功能 以及遥控设备和其他功能 的广泛兼容性
使用 AVPlayerViewControllerDelegate 通知 来跟踪 演示状态 正如今天在 iOS 上所看到的那样 处理解除 正如在 tvOS 上 观察播放器项目状态 并处理错误
使用外部元数据 现在在 iOS 和 tvOS 上均可以使用 除了我们今天看到的 用于家长内容限制 和信息面板的一些用途以外 外部元数据还可用于 发布正在播放媒体的信息 这意味着如果你 在两个平台上使用外部元数据 你现在可以删除 所有正在播放的信息支持
如果你在向上滑动的操作中 有自定义叠层 请将其迁移 抱歉 如果你有向上滑动 显示叠层的操作 请转到自定义叠层 最后 支持家长 对内容设限
因此 相关更多信息 包括这次会议的示例代码 请访问屏幕上 URL 我们的会议页面 请带着你的疑问和代码 在今天下午 2 点 前往 AVKit 实验室 或是 4 点前往 AVFoundation 实验室 谢谢各位 请享受 会议的其他内容 [掌声]
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。