蓝牙ble数据转语音实现Android AudioRecord方法推荐
教程欢迎走进zozo的学习之旅。
概述
蓝牙BLE又称bluetooth smart,主打的是低功耗和快速链接,所以在支持的profile并没有audio的部分,而蓝牙语音协议A2DP只在传统蓝牙中有,本文就是提供一种利用ble数据来传输压缩语音,并最终在实现用android语音框架中的AudioRecord方法来获取语音流。
主要思路
首先问题的需求是从一种非标准的协议挂载成为一个标准协议。那通过修改kernel的bluetooth协议或者是修改android的语音框架都是可以实现的,但是不论哪种方式都要耗费大量的工作,而且这两种的哪一种的修改都会给平台的更换或者是系统版本的更换带来很大的障碍。
那这里提供的一种较为简单的思路来实现:在kernel内建议一个upcm的声卡,运行一个守护进程将ble的对应数据解压后放入声卡这样AudioRecord就可以获取PCM的语音流了。另外,android语音的挂载需要添加so库,并修改Audio的配置文件audio_policy.conf来添加。
UPCM分析
kernel声卡驱动
upcm的源码可关注我的代码仓库
蓝牙正常 连接 log
[ 633.209000] input: Broadcom Bluetooth HID as /devices/virtual/misc/uhid/input4
[ 633.217000] generic-bluetooth 0005:0000:0000.0002: input,hidraw0: BLUETOOTH HID v1.01 Mouse [Broadcom Bluetooth HID] on
[ 641.437000] UPCM : snd_u_capture_open
[ 641.440000] UPCM : snd_u_hw_params format 2, rate 16000, channels 1, period_bytes 2048, buffer_bytes 8192
[ 641.451000] UPCM: format 0x2, rate 16000, channels 1
[ 641.456000] UPCM : snd_u_pcm_prepare
[ 641.460000] UPCM : snd_u_substream_capture_trigger, cmd 1
[ 641.465000] UPCM: SNDRV_PCM_TRIGGER_START
[ 649.407000] UPCM: upcm_char_release
[ 651.592000] UPCM : snd_u_substream_capture_trigger, cmd 0
[ 651.597000] UPCM: SNDRV_PCM_TRIGGER_STOP
[ 651.602000] UPCM : snd_u_hw_free
[ 651.605000] UPCM : snd_u_capture_close
在内核路径下进行交叉编译,把编译完的upcm.ko放到文件系统/system/etc/下,在板级的init.rc里加入insmod /system/etc/upcm.ko。
这样上电就可以加载upcm.ko的驱动。驱动加载成功后,会建立/sys/class/sound/pcmC1D0c的虚拟通道,设备节点在/dev/snd/pcmC1D0c。
audio daemon
Audio