大多数浏览器和
Developer App 均支持流媒体播放。
-
调整你的 AirPlay 音频体验
了解如何升级你的 App 的 AirPlay 音频体验,使其更强大、响应更快。我们将向你展示如何通过 AVQueuePlayer 采用增强型音频缓冲功能,探索在你的 App 中构建自定义播放器的替代方案,并与你分享最佳实践。
章节
- 0:42 - AirPlay Overview
- 1:43 - Enhanced audio buffering
- 3:54 - Add support to your app
资源
相关视频
WWDC23
-
下载
♪ ♪
Kelly:大家好 我是 AirPlay 团队的的工程师 Kelly 欢迎来到本次讲座 今天 我们将介绍 最新版本隔空播放的一些功能 并为你提供一些小提示 以确保你在自己的 App 上 能提供极为出色的隔空播放体验 这是我们今天的议程 我将从隔空播放概述开始 然后探讨隔空播放的 增强型音频缓冲所提供的一些功能 最后 我将介绍如何将增强型 音频缓冲集成到你的 App 中 隔空播放是从 Apple 设备 分享视频、照片、音乐等 到附近的扬声器 和屏幕中最简单的方法 由于如今家庭中有 许多兼容隔空播放的设备 隔空播放比以往任何时候都更流行 你可通过以下 任一方式使用隔空播放: 通过隔空播放音频 你可将你喜爱的音乐或播客 通过流式传输完美地 同步到一个或多个 HomePod 和兼容隔空播放的扬声器 使用隔空播放视频 你可将你喜欢的电影和节目 从你的 Apple 设备 流式传输到 Apple TV 或兼容隔空播放的智能电视中 支持高达 4K 高动态范围的高画质传输 使用镜像 你可将 你的 Apple 设备上的内容 如照片、个人视频、 游戏、网页或电子表格 分享到 Apple TV 或兼容隔空播放的智能电视上 你的朋友和家人也可轻松 分享其 Apple 设备上的内容 今天的视频 我将重点介绍 隔空播放的音频流式传输方面 隔空播放为一个或多个设备提供了 无缝音频流式传输体验 如今支持隔空播放音频的设备 已形成了一个完整的生态系统 从 Apple 设备 比如 HomePod、Mac 和 Apple TV 到来自世界顶级品牌的 音频和视频产品 包括数亿智能电视 隔空播放非常方便 我个人非常喜欢 在日常生活中使用该功能
随着隔空播放的不断发展 开发人员和客户的 期望也在不断增长 为了将隔空播放提升到一个 新水平 有一个新改进的协议 隔空播放增强型音频缓冲功能 用来提供更好的 家庭影院和多声道体验 增强型音频缓冲功能从根本上 考虑到了整个家庭的音频需求 功能非常强大 音频流比实时播放速度更快 以尽量减少播放中断 它响应灵敏 因此当轻点 HomePod 或当你使用 iPhone 作为遥控器时 你的 App 都会立即响应 它支持多声道音频格式 比如 Apple TV 的杜比全景声 也支持在今年新推出的 iOS 中智能使用无损播放 增强型音频缓冲为 HLS 插片广告提供了最好的支持 以支持广告功能 你可从我的同事 Amit 的视频 “探索隔空播放与插片广告”中 进一步了解 HLS 插片广告相关信息 如你所见 我们为未来 增强型音频缓冲已打造了良好基础 集成该功能将为你的 App 打造极为优秀的隔空播放体验 让我们看看你如何能 从增强型音频缓冲中受益 我正在从我的手机 流式传输音频到 HomePod
想象一下我正在倒垃圾 现在已经超出了我的 Wi-Fi 范围 ♪ ♪ 请注意 HomePod 仍在播放中 当我尝试重新连接到网络时 我的音乐不会漏掉任何一个节拍 我的手机会无缝地 重新连接到 HomePod ♪ ♪ 我现在能再次从我的手机控制播放 当使用隔空播放在与 HomePod 等兼容隔空播放的扬声器上 播放音乐时 人们期望的就是这种表现 现在 增强型音频缓冲 提供了所有出色的功能 让我们将其纳入你的 App 中 让我们回顾一下如何 为你的 App 添加隔空播放支持
为你的 App 正确配置音频会话 以获取正确的 混音和中断行为 这非常重要 如果你 App 的核心是播放媒体 请将你的音频会话类别设置为播放 这将确保你的 App 的媒体 在 App 处于后台时 会继续播放
通常情况下你可将模式设为默认值 但建议像播客或 有声读物这样的人声音频 将模式设置为 spokenAudio 最后 将音频会话的 路由策略设置为 longFormAudio 长格式音频是除 系统声音以外的任何音频内容 例如音乐或播客 今年新功能是 隔空播放比以往更能无缝传输 你的 iPhone 和 iPad 现在使用设备端智能技术 来学习你的隔空播放偏好 因为你通常在做饭时听音乐 所以厨房附近的 HomePod 会自动显示出来 这使得人们 可以轻松地在他们希望的地方 播放你的 App 的内容 如果你提供长格式音频内容 那么你会想要支持该功能 在你的 App 中添加 智能隔空播放 建议支持非常简单 除了我们已讨论过的 AVAudioSession 配置之外 唯一的新步骤 是转到你的 App 的 Info.plist 将 AVInitialRouteSharingPolicy 键值设为 LongFormAudio
在 Xcode 中 此键值在下拉菜单中被称为 “隔空播放优化策略” 就是这样 iOS 将处理其余部分 并使用设备上的学习功能 在人们打开你的 App 时 智能地为其使用附近的扬声器
接着 将 AVRoutePickerView 添加到你的视图层次结构中 以在你的 App 中 包含隔空播放选择器 该选择器为用户提供了 一个潜在的隔空播放设备列表 在你的 App 中可使用这些设备
最后 使用 MPNowPlayingInfoCenter 通知系统 当前播放中的项目 并使用 MPRemoteCommandCenter 接收远程命令 如播放、暂停或跳过 以上内容已涵盖了 你 App 的隔空播放设置 现在 为了支持增强型音频缓冲 你需要采用这两组 API 之一 AVPlayer 和 AVQueuePlayer 或 AVSampleBufferAudioRenderer 和 AVSampleBufferRenderSynchronizer
这两组 API 都适用于非隔空播放 包括本地播放或蓝牙播放 然而 一些开发者可能希望 为隔空播放和非隔空播放 使用不同的 API 在此情况下 你的 App 可注册 routeChangeNotification 并根据当前路由进行相应的操作
AVPlayer 和 AVQueuePlayer 为你的 App 提供了 支持增强型音频缓冲的最简单方法
对于大多数 App 开发者 我们建议采用 AVQueuePlayer
AVQueuePlayer 将处理 大部分播放需求 如管理项目、 控制播放和在媒体中搜索
大多数 Apple 自己的媒体 App 也使用 AVQueuePlayer 首先 创建一个队列播放器 确定一个指向你想要 播放的本地或云内容的 URL
然后使用该 URL 创建一个 AVAsset 实例 并使用该 asset 创建一个 AVPlayerItem 实例
最后 将 AVPlayerItem 提供给播放器并开始播放 就是这么简单 你可能会想 “这只是将播放项 enqueue 到播放器中 隔空播放部分在哪?” 没错 通过使用 AVPlayer 和 AVQueuePlayer 当其被路由到隔空播放时 你会自动获得增强型音频缓冲 要了解更多 AVPlayer 的相关功能 请参阅说明中的链接 如果你有一个独特的 App 需要在媒体数据上执行预处理 或你的 App 中有 AVPlayer 不支持的 DRM 模型 那你可使用 AVSampleBufferAudioRenderer 和 AVSampleBufferRenderSynchronizer 你将使用这些 API 将多个排队的样本缓冲区 同步到单个时间轴上 这里我将介绍如何使用它 来 enqueue 音频数据的基础知识 首先 你需要创建一个 串行队列来执行所有播放操作 创建音频渲染器和渲染同步器 同步器用于建立媒体时间轴 然后 将音频渲染器 添加到渲染同步器中 这将告诉音频渲染器 要跟随媒体时间轴 要 enqueue 音频数据 请安装一个回调 这能让你知道你需要更多数据
在该回调中开始排队音频数据
当没有更多音频数据时 告诉渲染器停止请求数据 这只是接口的基础知识 更多详细信息 请参阅说明中的链接 我们在其中 深入介绍了如何使用此 API 以及构建自定义播放器的示例项目 以上涵盖了你可使用的两组 API 你可使用它向兼容隔空播放 的设备提供增强型音频缓冲 这还不是全部 汽车制造商现在能够 在其 CarPlay 车载实现中 支持增强缓冲 这为何重要? 越来越多的车辆支持 无线连接 CarPlay 车载 强大的播放功能 和灵敏的控制是在路上 获得最佳音频体验的关键 好消息是 使用我们之前 讨论过的两组 API 之一 可将增强型音频缓冲 添加到你的 App 中 这也将适用于 CarPlay 车载 使用你的 App 的 用户将在其旅程中获得 最佳的音频流式传输体验 总结一下 你需要 为隔空播放支持配置音频会话 在 App 中添加隔空播放选择器 将 Media Player 集成到你的 App 中 并采用 AVQueuePlayer 或自定义渲染和同步 API 以实现增强型音频缓冲 这只是个开始 我们正在不断改进并努力 为这项技术带来更多功能 希望你喜欢本期讲座 谢谢 ♪ ♪
-
-
4:00 - Set the audio type
let audioSession = AVAudioSession.sharedInstance() try audioSession.setCategory(. playback ,xmode: . default , policy:.longFormAudio )
-
7:23 - AVQueuePlayer
let player = AVQueuePlayer() let url = URL(string: "http://www.examplecontenturl.com") let asset = AVAsset(url: url) let item = AVPlayItem(asset: asset) player.insert(item, after: nil) player.play()
-
8:28 - Add the audio renderer to the render synchronizer
let serializationQueue = DispatchQueue(label: "sample.buffer.player.serialization.queue") let audioRenderer = AVSampleBufferAudioRenderer() let renderSynchronizer = AVSampleBufferRenderSynchronizer() renderSynchronizer.addRenderer(audioRenderer)
-
8:50 - Enqueue audio data
serializationQueue.async { [weak self] in guard let self = self else { return } // Start processing audio data and stop when there's no more data. self.audioRenderer.requestMediaDataWhenReady(on: serializationQueue) { [weak self] in guard let self = self else { return } while self.audioRenderer.isReadyForMoreMediaData { let sampleBuffer = self.nextSampleBuffer() // Returns nil at end of data. if let sampleBuffer = sampleBuffer { self.audioRenderer.enqueue(sampleBuffer) } else { // Tell the renderer to stop requesting audio data. audioRenderer.stopRequestingMediaData() } } } // Start playback at the natural rate of the media. self.renderSynchronizer.rate = 1.0 }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。