将Raspberry Pi 3设置为蓝牙扬声器


36

我正在寻找一种使用Raspbian Jessie将Raspberry Pi 3配置为蓝牙扬声器的方法。我所说的蓝牙扬声器是指使用A2DP通过蓝牙接收音频流,并通过音频插孔,HDMI端口或USB音频适配器,通过连接到Raspberry Pi的扬声器播放音频。

不同的教程可以在线获得,但是已经过时了,大多数教程不再可用。


不清楚您所说的“作为蓝牙扬声器”是什么意思
Milliways

1
编辑。希望现在已经明确了
-gtatr

我很清楚,我有兴趣阅读任何真实的答案。
Burt_Harris '16

投票解决方案是我最终选择的类似路线。但是,我有一个github存储库,它将在新安装的raspbian Jessie Lite上为您进行设置(不确定是否在没有像素的Jessie的情况下对它进行少许配置)只需按照此处的安装说明进行操作:github.com/bareinhard / ...。我发现现有解决方案的主要问题是,默认情况下它们使用pulseaudio5。这将编译pa6并摆脱了pa5遇到的许多播放问题。
Brett Reinhard

Answers:


25

过了一会儿我一直在这个项目上(以帮助我的朋友毕业做论文),发现在线项目做得很好(尽管处理音频的pi远远落后于pi,并且压降使其冻结是唯一的方法)要使其重启,请拔下电源线)。

这是我一直在努力的步骤,并且适用于raspberry pi 3。

1.下载所需的软件包

该项目取决于pulseaudio,因此请键入以下内容进行抓取并安装:

sudo apt-get update && sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2 bluez-tools udev

我宁愿先更新树莓的固件,然后再安装它们,因为我的rpi-bluetooth软件包有问题,所以我这样做:

sudo rpi-update

并使其安装并前进到下一步。

2.编辑配置并应用它

首先将pi用户名添加到组pulseaudio中,

sudo usermod -a -G lp pi

使用文本编辑器在/etc/bluetooth/audio.conf下创建新配置,并添加以下行

[General]:
Enable=Source,Sink,Media,Socket

/etc/bluetooth/main.conf使用您喜欢的文本编辑器编辑文件(我正在使用nano)。

设置蓝牙类别,将以下行修改为:

 Class = 0x00041C

0x000041C 表示rpi蓝牙支持A2DP协议。

更改/etc/pulse/daemon.conf 添加/修改(不要忘记在添加代码之前彻底检查代码),然后更改

resample-method = trivial

您可以使用任何喜欢的方法,我个人可以speex-float-3作为参考,您可以看到此链接

使用以下命令启动pulseaudio服务:

pulseaudio -D

我们将使用ragusa87脚本自动将蓝牙源转​​换为音频接收器。首先,请通过编辑文件将新配置添加到udev init.d /etc/udev/rules.d/99-input.rules并将其添加到文件中

SUBSYSTEM="input", GROUP="input", MODE="0660"
KERNEL=="input[0-9]*", RUN+="/usr/lib/udev/bluetooth"

使用mkdir 将文件夹添加udev/usr/lib

sudo mkdir /usr/lib/udev && cd /usr/lib/udev

并将其添加到文件蓝牙中(信用ragusa87)

#!/bin/bash
# This script is called by udev when you link a bluetooth device with your computer
# It's called to add or remove the device from pulseaudio
#
#

# Output to this file
LOGFILE="/var/log/bluetooth_dev"

# Name of the local sink in this computer
# You can get it by calling : pactl list short sinks
# AUDIOSINK="alsa_output.platform-bcm2835_AUD0.0.analog-stereo"
AUDIOSINK="alsa_output.0.analog-stereo.monitor"
# User used to execute pulseaudio, an active session must be open to avoid errors
USER="pi"

# Audio Output for raspberry-pi
# 0=auto, 1=headphones, 2=hdmi. 
AUDIO_OUTPUT=1

# If on, this computer is not discovearable when an audio device is connected
# 0=off, 1=on
ENABLE_BT_DISCOVER=1

echo "For output see $LOGFILE"

## This function add the pulseaudio loopback interface from source to sink
## The source is set by the bluetooth mac address using XX_XX_XX_XX_XX_XX format.
## param: XX_XX_XX_XX_XX_XX
## return 0 on success
add_from_mac(){
  if [ -z "$1" ] # zero params
    then
        echo "Mac not found" >> $LOGFILE
    else
        mac=$1 # Mac is parameter-1

        # Setting source name
        bluez_dev=bluez_source.$mac
        echo "bluez source: $mac"  >> $LOGFILE

        # This script is called early, we just wait to be sure that pulseaudio discovered the device
        sleep 1
        # Very that the source is present
        CONFIRM=`sudo -u pi pactl list short | grep $bluez_dev`
        if [ ! -z "$CONFIRM" ]
        then
            echo "Adding the loopback interface:  $bluez_dev"  >> $LOGFILE
            echo "sudo -u $USER pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0"  >> $LOGFILE

            # This command route audio from bluetooth source to the local sink..
            # it's the main goal of this script
            sudo -u $USER pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0  >> $LOGFILE
            return $?
        else
            echo "Unable to find a bluetooth device compatible with pulsaudio using the following device: $bluez_dev" >> $LOGFILE
            return -1
        fi
    fi
}

## This function set volume to maximum and choose the right output
## return 0 on success
volume_max(){
    # Set the audio OUTPUT on raspberry pi
    # amixer cset numid=3 <n> 
    # where n is 0=auto, 1=headphones, 2=hdmi. 
    amixer cset numid=3 $AUDIO_OUTPUT  >> $LOGFILE

    # Set volume level to 100 percent
    amixer set Master 100%   >> $LOGFILE
    pacmd set-sink-volume 0 65537   >> $LOGFILE
    return $?
}

## This function will detect the bluetooth mac address from input device and configure it.
## Lots of devices are seen as input devices. But Mac OS X is not detected as input
## return 0 on success
detect_mac_from_input(){
    ERRORCODE=-1

    echo "Detecting mac from input devices" >> $LOGFILE
    for dev in $(find /sys/devices/virtual/input/ -name input*)
    do
        if [ -f "$dev/name" ]
        then
            mac=$(cat "$dev/name" | sed 's/:/_/g')
            add_from_mac $mac

            # Endfor if the command is successfull
            ERRORCODE=$?
            if [ $ERRORCODE -eq 0]; then
                return 0
            fi
        fi
    done
    # Error
    return $ERRORCODE
}
## This function will detect the bt mac address from dev-path and configure it.
## Devpath is set by udev on device link
## return 0 on success
detect_mac_from_devpath(){
    ERRORCODE=-1
    if [ ! -z "$DEVPATH" ]; then
        echo "Detecting mac from DEVPATH"  >> $LOGFILE
        for dev in $(find /sys$DEVPATH -name address)
        do
            mac=$(cat "$dev" | sed 's/:/_/g')
            add_from_mac $mac

            # Endfor if the command is successfull
            ERRORCODE=$?
            if [ $ERRORCODE -eq 0]; then
                return 0
            fi

        done
        return $ERRORCODE;
    else
        echo "DEVPATH not set, wrong bluetooth device? " >> $LOGFILE
        return -2
    fi
    return $ERRORCODE
}


## Detecting if an action is set
if [ -z "$ACTION" ]; then
    echo "The script must be called from udev." >> $LOGFILE
    exit -1;
fi
## Getting the action
ACTION=$(expr "$ACTION" : "\([a-zA-Z]\+\).*")

# Switch case
case "$ACTION" in
"add")

    # Turn off bluetooth discovery before connecting existing BT device to audio
    if [ $ENABLE_BT_DISCOVER -eq 1]; then
        echo "Stet computer as hidden" >> $LOGFILE
        hciconfig hci0 noscan
    fi

    # Turn volume to max
    volume_max

    # Detect BT Mac Address from input devices
    detect_mac_from_input
    OK=$?

    # Detect BT Mac address from device path on a bluetooth event
    if [ $OK != 0 ]; then
        if [ "$SUBSYSTEM" == "bluetooth" ]; then
            detect_mac_from_devpath
            OK=$?
        fi
    fi

    # Check if the add was successfull, otherwise display all available sources
    if [ $OK != 0 ]; then
        echo "Your bluetooth device is not detected !" >> $LOGFILE
        echo "Available sources are:" >> $LOGFILE
        sudo -u $USER pactl list short sources >> $LOGFILE
    else
        echo "Device successfully added " >> $LOGFILE
    fi
    ;;

"remove")
    # Turn on bluetooth discovery if device disconnects
    if [ $ENABLE_BT_DISCOVER -eq 1]; then
        echo "Set computer as visible" >> $LOGFILE
        sudo hciconfig hci0 piscan
    fi
    echo "Removed" >> $LOGFILE
    ;;

#   
*)
    echo "Unsuported action $action" >> $LOGFILE
    ;;
esac
echo "--" >> $LOGFILE

请注意,您的AUDIOSINK可能与我的不同,请在使用前进行检查 pactl list short sinks

通过输入此代码使脚本可执行

chmod 777 bluetooth 

插入耳机以测试音频插孔是否正常工作并进行测试

 aplay /usr/share/sounds/alsa/Front_Center.wav

或者您可以通过设置默认音频路由

须藤搅拌机cset numid = 3 n

其中n可能是:0 =自动1 =插孔2 = HDMI

3.配对并连接音频

转到终端并输入bluetoothctl。首先使用激活蓝牙,power on然后使用agent on设置您之前一直在编辑的默认代理,default-agent然后使用设置可发现模式和配对模式discoverable on; pairable on。您应该在手机或笔记本电脑上看到raspberrypi蓝牙,然后单击并触摸配对即可在手机上将其配对。在终端上,键入y。返回终端,通过键入以下内容连接到电话,connect xx:xx:xx:xx:xx:xx其中xx:xx:xx:xx:xx:xx是您的电话蓝牙mac地址。并且不要忘记信任trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xx您的电话是您的手机的蓝牙mac地址,瞧,您有使用树莓派的蓝牙放大器(或其他名称)。

4。结论

经过尝试后,我发现音频质量很差,我宁愿不使用它,因为如果您将树莓派与歌曲流传输到树莓派一起使用,它将被冻结。我建议通过使用gmediarenderer使用UPNP扬声器项目。音频很棒,没有延迟和分散的声音,并且可以播放无损音频文件(flac,wav,dll)。这是详细的设置方法

参考: jobpassion的教程rag的剧本 ; 相关工作 ;


我无法执行sudo service pulseaudio restart,得到了Failed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr

此外,bluetoothctl当我connect xx:xx:xx:xx:xx:xx开始Failed to connect: org.bluez.Error.Failed使用手机或笔记本电脑时
gtatr

您正在使用什么操作系统?唯一支持树莓派3板载蓝牙的操作系统是raspbian Jessie和Ubuntu Mate> 16.04。在Ubuntu Mate上已经存在蓝牙a2dp,因此您可以在Bluetooth Manager上进行检查。
xdhe

如果您已经尝试过任何在线教程并搞砸了,我认为最好重新安装并清除软件包的配置。我已经通过手动安装“ rpi-bluetooth”软件包来弄乱了蓝牙软件包,但蓝牙无法正常工作。因此,我重新刷新了Raspbian图像,尽管IMO声音不佳,但效果很好。
xdhe

我使用的是全新安装的Raspbian Jessie,而且我会逐步按照您的说明进行操作,也许新安装的OS缺少步骤。我可以试试Ubuntu Mate
gtatr '16

16

这是一种不依赖PulseAudio的替代解决方案:https : //github.com/lukasjapan/bt-speaker

以根用户身份在raspbian上安装:

curl -s https://raw.githubusercontent.com/lukasjapan/bt-speaker/master/install.sh | bash

它将启动蓝牙扬声器守护程序,该守护程序自动接受A2DP / AVRCP的单个客户端,并将音频流直接传输到ALSA。


安全提示:我自己编写了脚本,所以可以向您保证它是安全的,但请您自己验证内容
Lukas

真好!我将在接下来的几天中尝试进行测试
gtatr

1
我正在尝试您的解决方案,但效果很好,但音频隔秒停住了。为什么会这样呢?
wolfram77

最有可能是Wifi问题:github.com/lukasjapan/bt-speaker/issues/4
Lukas

3

在博客上为Raspberry Pi 3编写了简洁的说明。在线上的大多数说明适用于Debian / Xbian的旧版本。这是我已经测试过的说明,并且正在使用Xbian在Raspberry Pi 3上工作。

  1. 首先安装/更新所有软件包

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. 将用户添加到组。这个非常重要。如果使用其他发行版,请用您的用户名替换“ xbian”。

    sudo gpasswd -a xbian pulse
    sudo gpasswd -a xbian lp
    sudo gpasswd -a pulse lp
    sudo gpasswd -a xbian audio
    sudo gpasswd -a pulse audio
    
  3. 设置PulseAudio和蓝牙设备类别

    sudo sh -c "echo 'extra-arguments = --exit-idle-time=-1 --log-target=syslog' >> /etc/pulse/client.conf"
    sudo hciconfig hci0 up
    sudo hciconfig hci0 class 0x200420
    sudo reboot
    

蓝牙服务/设备类别0x200420表示设备已设置为车载音频。请参阅此链接以探索更多的蓝牙类选项。

  1. 要与设备配对,我们将需要使用“ bluetoothctl”工具。

    sudo bluetoothctl
    
  2. 将代理设置为KeyboardOnly并将其设置为默认值。这仅需要执行一次。在bluetoothctl中,运行以下命令:

    agent KeyboardOnly
    default-agent
    
  3. 打开手机/平板电脑上的蓝牙,并确保可发现。在bluetoothctl中运行以下命令:

    scan on
    pair xx:xx:xx:...
    trust xx:xx:xx:...
    exit
    

    xx:xx:xx:..是您的手机/设备的MAC地址。运行“扫描”后,请等待一分钟,以便您的设备及其MAC地址显示出来。运行“ pair xx:xx:xx:..”后,检查您的设备并接受传入的连接。通过在终端上输入是,执行相同的操作。

  4. 现在,从手机连接到Raspberry Pi,它应该作为音频设备连接。现在,应根据Pi的配置,使用Raspberry Pi的HDMI或Analog out输出通过设备播放的所有音频。

  5. 如果连接失败,请重试,有时需要2次尝试。


感谢您抽出宝贵的时间回答。不鼓励仅链接的答案,因为不知道另一端是什么-如果链接的文章更改或消失,则此答案也一样。你能总结一下重点吗?
goobering

@goobering:发布已更新。我对Stack网站上的格式不太熟悉,但是我已尽其所能。感谢您抽出宝贵的时间来查看我的答案。祝您有个美好的一天
阿卜杜勒·穆德

1
您如何解决断断续续的音频?
NoBugs

超级动荡。我们必须超频pi吗?
b-ak

1
阿卜杜勒(Abdul)的指令工作正常,但是通过BT扬声器输出的音频非常不稳定。在任何情况下,这都是不可接受的音频质量。通过Pulseaudio提供的PI本机音频非常糟糕。是时候寻求比蓝牙更好的解决方案了。
唐·艾伦

0

在沿着那条路线出发之前,您是否考虑过RPi 3.5mm音频插孔输出的质量差的问题?

Raspberry Pi的声音输出

这可能就是为什么您找不到最新的教程。

公平地说,另一个原因可能是,像样的扬声器对并不比像样的蓝牙扬声器贵。我不会走这条路,除非您打算同时购买USB声卡(虽然价格不贵,但您的总价现在开始上涨)。或者,也许您打算使用HDMI输出?真的很好

这个怎么样?所有组件都应随时可用。

http://www.instructables.com/id/Turn-your-Raspberry-Pi-into-a-Portable-Bluetooth-A/

这是我的第一个RPi项目。我的外观还不太好,但是我相信MPD组件可用于将蓝牙流传输到RPi。我让你去做研究。

http://www.bobrathbone.com/raspberrypi_radio.htm


我同意您的观点,即那里有更好的现成解决方案,而且价格并不昂贵,但我希望它成为更大项目的一部分
gtatr

我只是推测老年人指示的原因。但是,有关其他解决方案,请参阅其他说明。查看MPD守护程序。我可能会误会,但我认为它可以串流Bt。可以使用更多细节。如果您要使用3.5毫米音频插孔,则在75%的音量下可能会正常工作,但是您需要依靠外部放大器进行音量控制。
KDM

顺便说一句,我尝试了该教程,以及几乎所有其他在线教程,但都没有成功
gtatr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.