| <html devsite><head> |
| <title>多区音频</title> |
| <meta name="project_path" value="/_project.yaml"/> |
| <meta name="book_path" value="/_book.yaml"/> |
| </head> |
| |
| <body> |
| <!-- |
| Copyright 2018 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <p> |
| 虽然 Android 9 不支持多区音频,但 Android 音频团队探索了一些可能有助于实现多区音频的方法。本部分详细介绍了其中的一些方法,这些方法可能有助于系统实现者着手构建后座娱乐系统 (RSE) 解决方案。 |
| </p> |
| |
| <h2 id="user-cases">用例</h2> |
| |
| <ul> |
| <li>后座中的收音机与前座中的不同媒体源同时播放。</li> |
| <li>前座乘客与司机收听不同的媒体源(例如,乘客在自己的屏幕上玩游戏,而司机在主屏幕上查看导航)。</li> |
| <li>四个不同的独立音频区:驾驶座、副驾驶座、后座 1、后座 2。</li> |
| </ul> |
| |
| <h2 id="limitations">限制</h2> |
| |
| <p> |
| 由于存在以下限制,Android 9 本身不支持多个音频堆栈(音频区)或不同的优先级: |
| </p> |
| |
| <ul> |
| <li>Android 9 不提供可使应用定位到特定音频区的 API。取而代之的是,应用必须定位到音频类型(媒体、通知等),这需要从 Android 提供的预定义集内进行选择。例如,Android 目前不支持将目标<strong>音频区 2</strong> 的音频类型定义为<strong>媒体</strong>。</li> |
| <li>物理声音流(由 AudioFlinger/内部混音器提供)不会在混音后传输上下文信息(例如,在逻辑声音流内进行标记),这导致音频 HAL 无法将特定逻辑声音流路由到不同的音频区。</li> |
| </ul> |
| |
| <h2 id="scenario-multiple-instances">方案:使用多个实例</h2> |
| |
| <p> |
| 此方案使用多个 Android 汽车实例来实现多区音频效果。 |
| </p> |
| |
| <ul> |
| <li>每个音频区都有自己的 Android 汽车实例,这些实例可独立管理音频区中的内容。HAL 下方的硬件可合并,并可协调多个实例的输出。</li> |
| <li>实例位于不同的硬件(例如,后座中的平板电脑)之上,或者通过管理程序共享物理硬件。</li> |
| <li>使用一个主音频区将输出静态分配到车载音响设备,或在 HAL 下进行动态分配。</li> |
| <li>第一方应用(安装在每个实例中)通过专有协议进行协作,从而协调各种声音并将其路由到特定音频区。或者,使用 ChromeCast 功能跨不同实例甚至是设备进行通信。</li> |
| </ul> |
| |
| <h2 id="scenario-target-secondary-zones">方案:定位到辅助区</h2> |
| |
| <p> |
| 此方案使用第一方应用来明确定位到被 Android 忽略的辅助区。 |
| </p> |
| |
| <ul> |
| <li>原始设备制造商 (OEM) 在 <code>audio_policy_configuration.xml</code> 中定义额外的输出音频设备端口。</li> |
| <li>隐式了解车辆配置的第一方应用可以使用 <code>AudioTrack.setPrefereceDevice()</code> API 来枚举可用输出端口,并明确定位到其中任意一个端口。</li> |
| </ul> |
| |
| <h2 id="scenario-audio-policy-rules">方案:使用音频政策规则</h2> |
| |
| <p> |
| 此方案使用音频政策规则向其他音频设备动态添加路由专用的 UID。 |
| </p> |
| |
| <ul> |
| <li>音频路由引擎根据发出请求的应用的 UID 来定义路由规则。</li> |
| <li>系统级服务或启动器添加相应规则,将特定应用 (UID) 的输出发送到与辅助音频区关联的特定设备。</li> |
| <li>除了为预定义音频上下文的路由提供的设备之外,还要定义这些特定设备。</li> |
| </ul> |
| |
| </body></html> |