Android平台远程声音播放及采集方案

1. 远程声音播放方案简介

目前终端常见的声音输出方式可以有喇叭、耳机、蓝牙,并且具备声音输出通道自动切换能力,比如:连接蓝牙耳机,声音切到蓝牙,喇叭静音,断开蓝牙,声音切回喇叭。本方案试着使用TCP/IP技术替代蓝牙传输,实现一种类似于蓝牙音乐的远程声音播放方案。

1.1 应用场景

比如:用户观看电视节目,当手机app连接电视,用户选择手机发声,那么电视机的喇叭自动静音,而将声音转到手机上输出。

1.2 交互简图

Android平台远程声音播放及采集方案_第1张图片

2 现有 Android Audio 框架分析

2.1 Audio 架构

Android Audio 框架的核心在 AudioServer,AudioServer 主要由 AudioFlinger 和 AudioPolicyService 组成,其中 AudioFlinger 负责播放及录制,AudioPolicyService 负责多外设之间的调度与切换。

每类音频外设模块(HW Module)会实现一份 Audio HAL,AudioServer 将处理后的音频流发送至 Audio HAL,Audio HAL 再将音频流转发至对应的驱动或外设实现播放。声音录制流程则正好相反。

2.2 AudioServer 启动过程

AudioServer 由 Linux init 进程启动,AudioServer 启动主要做下面几件事:

  1. 创建 AudioFlinger 和 AudioPolicyService。
  2. 解析 Audio Config 文件(audio_policy_configuration.xml),获取支持的音频外设列表及各输入输出通路详细参数。
  3. 根据解析得到的外设列表,加载所有的 Audio HAL 库。
  4. 为所有 output 设备打开 outputStream 并创建 PlaybackThread 线程。
  5. 为所有 input 设备打开 inputStream 并创建 RecordThread 线程。
Android平台远程声音播放及采集方案_第2张图片

2.3 AudioTrack 播放过程

Android 声音播放都是通过 AudioTrack 进行,包括 MediaPlayer 最终也是创建 AudioTrack 来播放的。通过 AudioTrack 播放声音主要包括下面几步:

  1. 创建 AudioTrack。
  2. 调用 AudioTrack 的 play() 方法。
  3. 调用 AudioTrack 的 write() 方法写入音频数据。

创建 AudioTrack 时重点是通过 AudioPolicyManager 分配了音频路由通路,同时通知服务端 AudioFlinger 创建对应的 Track,用于接收音频数据。

调用 play() 方法主要是将创建的 Track 加到 mActiveTracks 并激活沉睡的 PlaybackThread 线程。

调用 write() 方法通过共享内存将数据写入服务端 AudioFlinger,PlaybackThread 收到数据激活线程,将数据进行混音等处理再写入对应的 Audio HAL,Audio HAL 再将数据写入驱动或其它外设。

Android平台远程声音播放及采集方案_第3张图片

2.4 多 Audio 设备架构及调度

Android 平台允许多种 Audio 设备共存,它们统一由 audio_policy_configuration.xml 配置文件进行描述,AudioServer 启动时会解析此配置文件,并根据描述信息加载对应的 Audio HAL 库,同时为每个输出通路创建 PlaybackThread,为每个输入通路创建 RecordThread 线程。

声音播放时具体选择由何通路输出,由 AudioPolicyService 根据一系列路由策略来切换,例如:当蓝牙耳机连接时,声音切到蓝牙通路输出。当 USB 喇叭连接时,声音切到 USB 通路输出。

Android平台远程声音播放及采集方案_第4张图片

3 如何实现声音远程播放及采集

3.1 扩展 IP Sound 声卡

根据 Android 平台的多 Audio 设备架构,我们可以轻松的扩展出任意 Audio 设备。

回到本方案,我们需要实现声音远程播放(包括局域网与广域网),我们选定的通信方式为 TCP/IP 技术,数据通过 TCP/IP 传输不是本方案的关注重点,这里主要讲如何将音频数据截获并通过 TCP/IP 转发至远程终端。

按照以下架构扩展名为 IP Sound Card 的声卡,AudioPolicyService 增加新的策略用于切换到 IP Sound Card 通路,实现 IP Sound Card HAL,HAL 中将收到音频数据,收到数据后通过提前建立好的 TCP/IP 连接发送到远程终端。

Android平台远程声音播放及采集方案_第5张图片

3.2 远程声音采集

远程声音采集将远程终端做为麦克风,实现远程声音录制,其数据流程跟播放恰好相反,这里不再赘述。

你可能感兴趣的:(Android平台远程声音播放及采集方案)