PulseAudio与蓝牙音频

背景

Linux下面是怎么使用蓝牙音频的呢? 今天我们一起来看看,通过命令行使用 PulseAudio 来联动蓝牙音频。

PulseAudio与Bluetooth音频

PulseAudio的所有蓝牙功能都依赖于BlueZ,此外,HFP支持还需要oFono
PulseAudio 支持3个主要的和音频相关的蓝牙profiles:

  • A2DP (Advanced Audio Distribution Profile)
  • HSP (Headset Profile)
  • HFP (Hands-Free Profile)

PulseAudio蓝牙后端

Bluetooth backend listens to BlueZ and oFono events on D-Bus and automatically creates PulseAudio cards, sources, and sinks for all discovered Bluetooth devices.
PulseAudio的蓝牙后端会监听D-Bus上的BlueZ和oFono事件,然后对于多有发现的蓝牙设备自动地创建PulseAudio声卡,sources和sinks。

现在比较新的版本,蓝牙连接后,使用aplay -lls /proc/asound/看不到PulseAudio蓝牙虚拟的出来的声卡,需要使用PulseAudio的命令pactl list cards查看

蓝牙音频也可以不用PulseAudio,使用 BlueALSA (bluez-alsa),这个我们后面再学习研究。

前提条件

蓝牙

  • 蓝牙模块已通

  • 确保bluez的守护进程已启动

    $ bluetoothd&
  • 确保已开启蓝牙设备

    $ rfkill unblock bluetooth
  • 确保已up蓝牙

    $ hciconfig hci0 up

    如果提示要找到用户,则还需要添加bluetooth用户

    #添加bluetooth用户
    $ sudo usermod -G bluetooth -a xxx

    PulseAudio

  • 安装pulseaudio及相关插件,可以通过编译安装或包的方式(带包管理)

    #包的方式
    $ sudo apt-get install pulseaudio pulseaudio-module-bluetooth
  • 保证pulseaudio已经起来,未启动则开启:

    $ pulseaudio --system
  • 新建pulse用户`

    #新建pulseaudio用户
    $ sudo addgroup -S pulse 
    $ sudo adduser -S pulse -G pulse

    蓝牙配对连接

使用蓝牙音频的前提是已配对连接蓝牙音频设备,这里使用bluetoothctl工具进行蓝牙配对连接。

$ bluetoothctl
#上电
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent 
#扫描
[bluetooth]# scan on
#配对
[bluetooth]# pair xx:xx:xx:xx:xx:xx
#连接
[bluetooth]# connect xx:xx:xx:xx:xx:xx
#trust 自动重连
[YYY]# trust xx:xx:xx:xx:xx:xx

PulseAudio音频端

查看是否已经有虚拟的蓝牙音频声卡及相关的 sinks 和 sources:

$ pacmd list-cards
$ pactl list sinks
$ pactl list sources

A2DP模式

#设置card profile
$ pacmd set-card-profile bluez_card.xx_xx_xx_xx_xx_xx a2dp_sink
#设置默认sink
$ pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx.a2dp_sink

#使用paplay播放音频
paplay -v xxx.wav

HSP模式

$ sudo hcitool cmd 0x3F 0x01C 0x01 0x02 0x00 0x01 0x01
#设置card profile
$ pacmd set-card-profile bluez_card.xx_xx_xx_xx_xx_xx headset_head_unit
#设置默认sink
$ pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx.headset_head_unit
#设置默认source
$ pacmd set-default-source bluez_source.xx_xx_xx_xx_xx_xx.headset_head_unit

#使用paplay播放音频
paplay -v xxx.wav
#使用parecord录音
parecord -v yyy.wav

扩展–修改PulseAudio日志等级

pacmd set-log-level 4
pacmd set-log-meta 1
#之后查看syslog

参考