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

在线上提供了不同的教程,但这些教程已经过时了,大多数教程不再起作用。

评论

不清楚“作为蓝牙扬声器”是什么意思

编辑。希望现在已经明确

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

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

#1 楼

过了一会儿我一直在这个项目上(以帮助我的朋友做毕业论文),发现在线项目做得很好(尽管处理音频的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


我宁愿先更新raspberry的固件在安装它们之前,因为我对rpi-bluetooth软件包有问题,所以我要这样做:

sudo rpi-update


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

2 。编辑配置并应用

首先将pi用户名添加到pulseaudio组中,并在/ etc / bluetooth / audio下创建新配置。
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脚本自动执行蓝牙音频接收器。首先,请通过编辑文件/etc/udev/rules.d/99-input.rules将新配置添加到udev init.d中,并将其添加到文件中。通过使用mkdir
<将文件夹udev添加到/usr/lib br />
SUBSYSTEM="input", GROUP="input", MODE="0660"
KERNEL=="input[0-9]*", RUN+="/usr/lib/udev/bluetooth"


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

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



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


通过输入以下代码使脚本可执行。

#!/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 "" ] # zero params
    then
        echo "Mac not found" >> $LOGFILE
    else
        mac= # 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


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

chmod 777 bluetooth 


,或者可以使用

<设置音频的默认路由sudo混合器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:x x是您的电话蓝牙mac地址。并且不要忘记相信trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xx是您的电话蓝牙mac地址,瞧,您可以通过使用树莓派获得蓝牙放大器(或其他名称)。

4。结论

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

参考:
jobpassion的教程;
ragusa的脚本;
相关工作;

评论


我无法执行sudo服务pulseaudio重新启动,我无法重新启动pulseaudio.service:单元pulseaudio.service无法加载:没有这样的文件或目录。

–gtatr
16年5月30日在21:21

此外,当我连接xx:xx:xx:xx:xx:xx:xx时,使用bluetoothctl时我无法连接:org.bluez.Error.Failed using my phone or laptop

–gtatr
16年5月30日在21:30

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

–xdhe
16年5月31日在4:56



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

–xdhe
16年5月31日在5:08

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

–gtatr
16年5月31日在10:18



#2 楼

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

以root身份在raspbian上安装:
<
curl -s https://raw.githubusercontent.com/lukasjapan/bt-speaker/master/install.sh | bash


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

评论


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

–卢卡斯
17 Mar 15 '17 at 0:56

真好!我将在未来几天尝试测试

–gtatr
17年3月16日在19:45

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

–wolfram77
17年11月15日在18:05

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

–卢卡斯
17年11月25日在6:05

迄今为止最好的解决方案。简单而直接。唯一的“问题”是轻微的延迟(大约500毫秒),这使观看动作不愉快。

–托马斯·克里斯托夫(Thomas Christof)
19/12/7在21:50

#3 楼

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



从安装/更新所有软件包开始


sudo apt-get update
sudo apt-get upgrade
sudo apt-get install pulseaudio-module-bluetooth bluez-tools




将用户添加到组。这个非常重要。如果使用其他发行版,请用您的用户名替换“ 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




设置PulseAudio和Bluetooth设备类


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表示该设备已设置为车载音频。请参阅此链接以探索更多的蓝牙类选项。



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


sudo bluetoothctl




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


agent KeyboardOnly
default-agent




打开手机/平板电脑上的蓝牙并确保它可发现的。在bluetoothctl中运行以下命令:


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


xx:xx:xx:..是您的手机/设备的MAC地址。运行“扫描开启”后,请稍等片刻,让您的设备及其MAC地址显示出来。运行“ pair xx:xx:xx:..”后,检查您的设备并接受传入的连接。通过在终端上键入yes,在终端上执行相同的操作。


现在从您的手机连接到Raspberry Pi,它应该作为音频设备连接。现在,应根据树莓派的配置,使用Raspberry Pi的HDMI或Analog out输出通过设备播放的所有音频。
如果连接失败,请重试,有时需要2次尝试。


评论


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

– goobering
16年6月22日在9:59

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

–阿卜杜勒·穆埃(Abdul Mueid)
16年6月22日在11:33

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

– NoBugs
17年2月6日在4:05



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

–b-ak
17年2月11日在16:01

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

–唐·艾伦
17年5月26日在17:11

#4 楼

在沿那条路线出发之前,您是否考虑过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
16年5月22日在10:58



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

– KDM
16年5月22日在13:04

顺便说一句,我尝试了该教程,以及几乎所有其他在线教程,但都没有成功

–gtatr
16年5月22日在17:21