大多数浏览器和
Developer App 均支持流媒体播放。
-
在 Apple tvOS 上提供出色的播放体验
了解如何使用 Apple TV 重新设计的播放界面在您的 app 中构建出色的媒体体验。了解最新的界面如何帮助人们在保持对内容关注的同时访问相关控件和信息。我们将展示如何为您的 Apple tvOS app 采用 AVPlayerViewController 和其他 API,以帮助人们查找、播放和享受内容。为了能充分了解本节内容,我们建议您对 AVKit 作基本了解。
资源
相关视频
WWDC21
WWDC20
WWDC19
-
下载
♪低音音乐播放♪ ♪ 马克思斯特潘诺夫:哈啰! 我是马克思 我是tvOS团队的软件工程师 今天我很开心要跟大家分享 在Apple TV上 优异、全新的 媒体播放用户界面 外观 以及身为开发者的各位 可以如何让这些新功能 发挥最大的功用 在这个课程中 我们会简略介绍 在tvOS 15中 标准播放用户界面的增强 我们会介绍新的API 最后 我们会讨论 能帮助大家在你们的应用程序中 建立优异的播放体验的最佳体验 让我们开始吧 AVPlayerViewController 会在Apple TV 提供用户标准媒体播放 它支持各式各样的遥控器 包括新的点击轮遥控器 以及跳过、扫描、环状旋转功能 Siri命令、插页支持等等 我们鼓励大家在你们的应用程序中 开始使用AVPlayerViewController 让用户有类似在Apple TV上 第一方应用程序的体验 如果你还没用过 AVPlayerViewController 或是想复习一下 我推荐大家去看 在2019年WWDC的 《以AVKit带来直觉式的媒体播放》 里面有详细说明 如何将AVPlayerViewController 嵌入你的应用程序中 让我们浏览一下今年我们带来 哪些新的增强 在tvOS 15中 我们重新设计整个 标准播放用户界面 来帮助观众专注于 更一致的交互式体验 通过在播放时间列 加上相关的控制和选项 我们改善了一般播放任务的可寻性 例如开启字幕或改变音频语言 播放时间列控制可以是一般通用的 也可以是应用程序专用的 有了新的内容页签 用户可以轻易地存取辅助信息 像是信息或章节 让大家能取得和探索内部导航 内容页签也可以用来显示相关内容 在这个范例中 我正在看去年WWDC的内容 而且我可以在不离开播放器的状况下 浏览推荐的内容 最后 我们加入了上下文动作 让用户能在播放期间使用 这些动作有完美的功能性 像是略过简介或回顾 要充分利用Apple TV上 新的播放用户界面 你的应用程序必须链接到 tvOS 15 SDK 我们用这个方法来维持 和任何能从App Store中取得 现有的应用程序 之间的兼容性 那些应用程序会取得默认的 tvOS 14播放用户界面 和功能 现在 你应该很期待要学习 如何将这个新的功能性 用在你的媒体应用程序中 让我们来探索tvOS 15中新的API… 从标题栏开始 新的标题栏就显示在播放时间列上面 能帮助用户马上知道他们在看什么 要呈现标题栏 我们会使用从目前 AVPlayerItem的元数据取得的 commonIdentifierTitle 和iTunesMetadata TrackSubtitle的值 如果媒体资产不包括嵌入的元数据 或者你需要增加它 使用AVPlayerItem的 externalMetadata属性 当播放实时串流内容时 标题栏也会显示一个标记 来向观众指示内容状态 最后 要是你的应用程序偏好 不要显示标题栏 可以通过将新属性transportBar IncludesTitleView的值 设定为假来禁止它 接着 让我们来看看播放时间列控制 播放时间列控制 位在播放时间列旋转触控上方的 用户界面组件集合 这些控制可以帮助用户快速和直观地 找到所有你的媒体应用程序 提供的播放选项 有些标准控制 像是字幕 音频语言和子母画面 是由系统所提供的 身为开发者 你可以延伸播放时间列控制的清单 利用AVPlayerViewController的 新属性 transportBarCustomMenuItems 它支持UIAction和UIMenu类别的实体 让我们来看一个 使用播放时间列控制的范例 这里 我使用UIAction 让用户新增目前的媒体项目 到他们的“最爱”上 你也可以通过UIMenu类别 建立更进阶的动作排列 并且将它们呈现在选单中 由AVPlayerViewController 呈现的UIMenus 会使用displayInline选项 来支持高达一层的巢套 想了解使用UIMenu和UIAction类别 更详细的内容 我建议大家去看 2019年WWDC的 《将你的用户界面更新到iOS 13》 现在 让我们来谈谈内容页签 内容页签能让你的应用程序 显示补充信息 或者推荐更多内容 当媒体资产包含嵌入的元数据 或是当你以AVPlayerItem 补充外部元数据时 AVPlayerViewController 就会显示信息页签 还有 当你用AVPlayerItem 供给navigationMarkerGroups时 AVPlayerViewController 就会显示章节页签 你的应用程序可以利用 AVPlayerViewController的新属性 customInfoViewControllers 来呈现额外的内容页签 在tvOS 15中 我们舍弃 customInfoViewController属性 而改用允许多重视图控制器的 新属性 要将你的内容页签重新调整成 适当的大小 请使用preferredContentSize属性 来指定高度 或是定义适当的自动布局限制 当你在计算显示内容页签 所需的高度时 系统会将所有视图控制器的大小 调整成最高内容页签的高度 当你在处理多重内容页签时 将你自定义的视图控制器 调整成一致的大小 或者在执行期间确认布局 和预期的相同 不要忘记在你的自定义视图控制器上 设定标题属性 我们会在内容页签的标题上用到它 为了帮助大家建立漂亮的内容页签 今年 我们在TVUIKit框架中 导入新的内容组态 TVMediaItemContent组态 和TVMonogramContent组态 让我们来看几个 如何将这些组态用在你的 编码中的范例 举例来说 要以16:9的宽高比来呈现 一系列的媒体项目 你可以使用来自 TVMediaItem ContentConfiguration的wideCell 设定它的属性 像是图像、标题 或是次要文字 你也可以配置它来显示标记 和播放进度 当你完成时 将contentConfiguration 指定到你的集合视图单元格 就是这么简单 如果你想要显示和目前媒体内容 相关的人物或角色 使用 TVMonogramContentConfiguration 想要更了解内容组态的使用 我推荐大家去看2020年WWDC的 《最新的单元格组态》 最后要讲的是上下文动作 上下文动作让你的应用程序 在播放期间显示相关的控制 要显示上下文动作 可以使用AVPlayerViewController的 新的contextualActions属性 并且提供一个或多个UIActions 一般来说 你的应用程序会希望 在相关内容段落中来呈现上下文动作 要做到这件事 可以通过加入周期和边界时间观察器 来观察AVPlayer的时间点 要隐藏上下文动作 重新将属性设定到空的数组上 你们有些人可能已经在 你的应用程序中 实作略过功能的解决方法 有了这个新的API 用户和上下文控制的互动 能和焦点行为一致 而且在使用的时候 它也会替你的应用程序 维持在“现在播放”状态 现在 让我们来讲一些在tvOS 使用AVPlayerViewController的 最佳实例 首先 也是最重要的 是要避免在播放器中加入多余的手势 这会干扰标准播放用户界面 而且未来绝对无法使用 第二 补足遗失的元数据 有时候我们会遇到没有将全部元数据 嵌入于它资产中的媒体 在这些案例中 要用AVPlayerItem的 externalMetadata属性 来提供所有必要的元数据 像是标题、缩图或叙述 当你做这件事的时候 我们会处理剩下的工作 以所有相关的信息 来填充标题栏和信息页签 最后 考虑在你的tvOS应用程序中 启用子母画面 它能给你的用户多任务处理的灵活性 让他们可以同时播放视频 以及能够在全屏幕内容 和子母画面之间切换 要开始使用子母画面 我建议大家去看 2020年WWDC的 《掌握tvOS上的子母画面》 让我们回顾一下 有了tvOS 15 可以更轻易地 使用标准播放用户界面 来建立优异的媒体体验 强大的新API 使得AVPlayerViewController 比过去更容易配置也更容易自定义 现在就是把它用在你的应用程序上 最棒的时机了 而且要开始使用它很简单 想知道更多信息 可以参考开发者app中 针对这个课程的补充资源 谢谢各位的观看 请好好享受今年的大会 ♪
-
-
4:42 - Transport Bar Controls Example
let favoriteAction = UIAction(title: "Favorites", image: UIImage(systemName: "heart")) { // Add to favorites } let submenu = UIMenu(title: "Speed", options: [.displayInline, .singleSelection], children: [ UIAction(…) ]) let menu = UIMenu(image: UIImage(systemName: "gearshape"), children: [submenu, UIAction(…)]) playerViewController.transportBarCustomMenuItems = [favoriteAction, menu]
-
6:11 - Content Tabs Example
// Initialize content tab view controller customViewController.preferredContentSize = CGSize(width: 0, height: 140) customViewController.title = "Recommended"
-
7:08 - TVMediaItemContentConfiguration Example
// Configure 16:9 UICollectionView cell import TVUIKit var contentConfiguration = TVMediaItemContentConfiguration.wideCell() contentConfiguration.image = UIImage(imageLiteralResourceName: "tanu") contentConfiguration.text = "Title" contentConfiguration.secondaryText = "Secondary text" contentConfiguration.badgeText = "NEW" contentConfiguration.badgeProperties.backgroundColor = .systemRed contentConfiguration.playbackProgress = 0.75 cell.contentConfiguration = contentConfiguration
-
7:36 - TVMonogramContentConfiguration Example
// Configure monogram UICollectionView cell import TVUIKit var contentConfiguration = TVMonogramContentConfiguration.cell() contentConfiguration.image = UIImage(imageLiteralResourceName: "jad") contentConfiguration.text = "Jad" cell.contentConfiguration = contentConfiguration
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。