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

1. 远程声音播放方案简介 目前终端常见的声音输出方式可以有喇叭、耳机、蓝牙,并且具备声音输出通道自动切换能力,比如:连接蓝牙耳机,声音切到蓝牙,喇叭静音,断开蓝牙,声音切回喇叭。本方案试着使用TCP/IP技术替代蓝牙传输,实现一种类似于蓝牙音乐的远程声音播放方案。
1.1 应用场景
比如:用户观看电视节目,当手机app连接电视,用户选择手机发声,那么电视机的喇叭自动静音,而将声音转到手机上输出。
1.2 交互简图
Android平台远程声音播放及采集方案
文章图片
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.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平台远程声音播放及采集方案
文章图片
2.4 多 Audio 设备架构及调度
Android 平台允许多种 Audio 设备共存,它们统一由 audio_policy_configuration.xml 配置文件进行描述,AudioServer 启动时会解析此配置文件,并根据描述信息加载对应的 Audio HAL 库,同时为每个输出通路创建 PlaybackThread,为每个输入通路创建 RecordThread 线程。
声音播放时具体选择由何通路输出,由 AudioPolicyService 根据一系列路由策略来切换,例如:当蓝牙耳机连接时,声音切到蓝牙通路输出。当 USB 喇叭连接时,声音切到 USB 通路输出。
Android平台远程声音播放及采集方案
文章图片
3 如何实现声音远程播放及采集 3.1 扩展 IP Sound 声卡
根据 Android 平台的多 Audio 设备架构,我们可以轻松的扩展出任意 Audio 设备。
回到本方案,我们需要实现声音远程播放(包括局域网与广域网),我们选定的通信方式为 TCP/IP 技术,数据通过 TCP/IP 传输不是本方案的关注重点,这里主要讲如何将音频数据截获并通过 TCP/IP 转发至远程终端。
【Android平台远程声音播放及采集方案】按照以下架构扩展名为 IP Sound Card 的声卡,AudioPolicyService 增加新的策略用于切换到 IP Sound Card 通路,实现 IP Sound Card HAL,HAL 中将收到音频数据,收到数据后通过提前建立好的 TCP/IP 连接发送到远程终端。
Android平台远程声音播放及采集方案
文章图片
3.2 远程声音采集
远程声音采集将远程终端做为麦克风,实现远程声音录制,其数据流程跟播放恰好相反,这里不再赘述。

    推荐阅读