Skonfiguruj Raspberry Pi 3 jako głośnik bluetooth

36

Szukam sposobu na skonfigurowanie Raspberry Pi 3 jako głośnika Bluetooth za pomocą Raspbian Jessie. Jako głośnik bluetooth mam na myśli odbieranie strumienia audio przez bluetooth za pomocą A2DP i odtwarzanie go przez głośniki podłączone do Raspberry Pi przez gniazdo audio, port HDMI lub adapter audio USB.

Różne samouczki są dostępne online, ale są dość przestarzałe i większość z nich już nie działa.

gtatr
źródło
Nie jest jasne, co rozumiesz przez „jako głośnik bluetooth”
Milliways
1
Edytowane. Nadzieja jest teraz jasna
gtatr
Doskonale dla mnie jasne, jestem zainteresowany przeczytaniem prawdziwych odpowiedzi.
Burt_Harris
Wybrane rozwiązanie jest podobną drogą, z którą skończyłem. Mam jednak repozytorium github, które skonfiguruje to dla ciebie na nowej instalacji raspbian Jessie Lite (nie jestem pewien, czy działa bez małej konfiguracji dla Jessie z pikselem), po prostu postępuj zgodnie z instrukcjami instalacji tutaj: github.com/bareinhard/... . Główny problem, jaki widzę w istniejących rozwiązaniach, polega na tym, że domyślnie używają pulseaudio5. Spowoduje to skompilowanie pa6 i pozbycie się wielu problemów z odtwarzaniem, których doświadcza pa5.
Brett Reinhard

Odpowiedzi:

25

Byłem przy tym projekcie po pewnym czasie (aby pomóc mojemu przyjacielowi w przygotowaniu papieru do ukończenia studiów) i stwierdziłem, że projekt online działa dobrze (chociaż przetwarzanie pi dźwięku jest opóźnione w stosunku do pi, a spadek napięcia powoduje, że zamarza jako jedyny sposób aby ponownie uruchomić komputer, należy odłączyć kabel zasilający).

To jest krok, nad którym pracowałem i działa na Raspberry Pi 3.

1. Pobierz wymagany pakiet

Ten projekt zależy od pulseaudio, więc weź go i zainstaluj, wpisując:

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

wolę najpierw zaktualizować oprogramowanie układowe malin przed ich instalacją, ponieważ mam problem z rpi-bluetoothpakietem, więc:

sudo rpi-update

i zainstaluj i przejdź do następnego kroku.

2. Edytuj konfigurację i zastosuj ją

Najpierw dodaj nazwę użytkownika pi do grupy pulseaudio za pomocą

sudo usermod -a -G lp pi

utwórz nową konfigurację w /etc/bluetooth/audio.conf za pomocą edytora tekstu i dodaj następujący wiersz

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

edytuj plik /etc/bluetooth/main.confza pomocą preferowanego edytora tekstu (używam nano).

Ustaw klasę Bluetooth, zmień następujący wiersz na:

 Class = 0x00041C

0x000041C oznacza, że ​​rpi bluetooth obsługuje protokół A2DP.

zmień /etc/pulse/daemon.conf dodaj / zmodyfikuj (nie zapomnij dokładnie sprawdzić kodu przed ich dodaniem) i zmień

resample-method = trivial

możesz użyć dowolnej metody, którą osobiście używam w speex-float-3celach informacyjnych, możesz zobaczyć ten link

uruchom usługę pulseaudio za pomocą:

pulseaudio -D

użyjemy skryptu ragusa87 do zautomatyzowania źródła bluetooth do zlewu audio. Najpierw dodaj nową konfigurację do udev init.d, edytując plik /etc/udev/rules.d/99-input.rulesi dodaj go do pliku

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

Dodaj folder udev, aby /usr/libza pomocą mkdir

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

i dodaj to do pliku bluetooth (kredyty 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

UWAGA: twój AUDIOSINK może różnić się od mojego, sprawdź go przed użyciem pactl list short sinks

uczynić skrypt wykonywalnym przez wprowadzenie tego kodu

chmod 777 bluetooth 

podłącz zestaw słuchawkowy, aby sprawdzić, czy gniazdo audio działa i przetestuj

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

lub możesz ustawić domyślne kierowanie audio za pomocą

sudo amixer cset numid = 3 n

gdzie n może być: 0 = auto 1 = jack 2 = hdmi

3. Sparuj i połącz audio

przejdź do terminala i wpisz bluetoothctl. Najpierw aktywuj bluetooth za pomocą, power ona następnie agent onustaw domyślnego agenta, który wcześniej edytowałeś default-agent, a następnie włącz tryb wykrywalności i tryb parowania za pomocą discoverable on; pairable on. Powinieneś zobaczyć raspberrypi bluetooth na telefonie lub laptopie i możesz sparować go na telefonie, klikając go i dotknij paruj. Na terminalu wpisz y. Po powrocie do terminala łączysz się z telefonem według typu, connect xx:xx:xx:xx:xx:xxgdzie xx:xx:xx:xx:xx:xx to adres MAC bluetooth. i nie zapomnij zaufać, używając trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxtelefonu Mac adres bluetooth. I voila, masz wzmacniacz bluetooth (lub jak tam się nazywa), używając malin.

4. Wniosek

po próbach i eksperymentach odkryłem, że jakość dźwięku jest niska i raczej nie używam go, ponieważ malina będzie zamrożona, jeśli użyjesz jej z piosenką przesyłaną strumieniowo do maliny. Radzę korzystać z projektu głośników UPNP za pomocą gmediarenderer. Dźwięk jest znakomity i nie ma opóźnień ani rozproszenia dźwięku i może odtwarzać bezstratny plik audio (flac, wav, dll). Oto szczegółowy sposób konfiguracji

odniesienie: samouczek Jobpassion ; scenariusz ragusa ; powiązana praca ;

xdhe
źródło
Nie jestem w stanie wykonać sudo service pulseaudio restart, otrzymujęFailed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr
Co więcej, bluetoothctlkiedy to zrobię connect xx:xx:xx:xx:xx:xx, Failed to connect: org.bluez.Error.Failedkorzystam z telefonu lub laptopa
gtatr
Jakiego systemu operacyjnego używasz? Jedyny system operacyjny obsługujący Raspberry Pi 3 na pokładzie Bluetooth to Raspbian Jessie i Ubuntu Mate> 16.04. Na Ubuntu Mate bluetooth a2dp jest już obecny, więc możesz to sprawdzić w Menedżerze Bluetooth.
xdhe
Jeśli już wypróbowałeś jakiś samouczek online i zepsułeś się, myślę, że najlepiej jest ponownie zainstalować i wyczyścić konfigurację pakietów. Mam problemy z pakietami Bluetooth, instalując ręcznie pakiet „rpi-bluetooth”, a Bluetooth nie działa. Więc zmieniłem obraz raspbian i działa dobrze, chociaż dźwięk nie jest przyjemny IMO.
xdhe
Korzystam ze świeżo zainstalowanej Jessie Raspbian i postępowałem zgodnie z twoimi instrukcjami krok po kroku, być może brakuje kroku pochodzącego ze świeżo zainstalowanego systemu operacyjnego. Mogę wypróbować Ubuntu Mate
gtatr
16

Oto alternatywne rozwiązanie, które nie opiera się na PulseAudio: https://github.com/lukasjapan/bt-speaker

Zainstaluj na Raspbian jako root z:

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

Uruchomi demona głośników bluetooth, który automatycznie akceptuje jednego klienta dla A2DP / AVRCP i przesyła strumień audio bezpośrednio do ALSA.

Lukas
źródło
Przypomnienie o bezpieczeństwie: napisałem skrypt osobiście, aby zapewnić cię, że jest bezpieczny, ale proszę sprawdź jego zawartość samodzielnie
Lukas
miły! Spróbuję to przetestować w najbliższych dniach
gtatr
1
wypróbowałem twoje rozwiązanie i zadziałało, ale dźwięk blokował się co sekundę. dlaczego to się dzieje?
wolfram77
Najprawdopodobniej problem Wi-Fi: github.com/lukasjapan/bt-speaker/issues/4
Lukas
3

Na moim blogu napisałem zwięzłe instrukcje dotyczące Raspberry Pi 3 . Większość instrukcji online dotyczy starszych wersji Debian / Xbian. Oto instrukcje, które przetestowałem i pracuję nad Raspberry Pi 3 z Xbianem.

  1. Zacznij od instalacji / aktualizacji wszystkich pakietów

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. Dodaj użytkowników do grup. To jest bardzo ważne. Jeśli używasz innej dystrybucji, zastąp „xbian” swoją nazwą użytkownika.

    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. Skonfiguruj PulseAudio i Bluetooth Device Class

    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
    

Usługa Bluetooth / klasa urządzenia 0x200420 oznacza, że ​​urządzenie jest skonfigurowane do Car Audio. Zobacz ten link, aby poznać więcej opcji Bluetooth Class.

  1. Aby sparować z urządzeniem, musimy użyć narzędzia „bluetoothctl”.

    sudo bluetoothctl
    
  2. Ustaw agenta na KeyboardOnly i ustaw go jako domyślny. Należy to zrobić tylko raz. Wewnątrz bluetoothctl uruchom następujące polecenia:

    agent KeyboardOnly
    default-agent
    
  3. Włącz bluetooth w telefonie / tablecie i upewnij się, że jest wykrywalny. Uruchom następujące polecenia w bluetoothctl:

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

    xx: xx: xx: .. to adres MAC słuchawki / urządzenia. Po uruchomieniu funkcji „włącz skanowanie” poczekaj minutę, aż urządzenie wyświetli się wraz z adresem MAC. Po uruchomieniu „parowania xx: xx: xx: ..” sprawdź urządzenie i zaakceptuj połączenie przychodzące. Zrób to samo na terminalu, wpisując „tak”.

  4. Teraz połącz się z Raspberry Pi ze swojego telefonu i powinien on zostać podłączony jako urządzenie audio. Cały dźwięk odtwarzany przez urządzenie powinien być teraz odtwarzany przy użyciu wyjścia HDMI lub wyjścia analogowego Raspberry Pi, w zależności od konfiguracji Pi.

  5. Jeśli połączenie nie powiedzie się, spróbuj ponownie, czasem potrzeba 2 prób.

Abdul Mueid
źródło
Dzięki za poświęcenie czasu na odpowiedź. Odpowiedzi tylko z linkiem są odradzane, ponieważ nie można powiedzieć, co jest na drugim końcu - jeśli połączony artykuł zmieni się lub zniknie, to również ta odpowiedź. Czy potrafisz streścić ważne punkty?
goobering
@goobering: Post został zaktualizowany. Nie znam się zbyt dobrze na formatowaniu na stronach stosu, ale zrobiłem to, co mogłem najlepiej. Dziękuję za poświęcenie czasu na sprawdzenie mojej odpowiedzi. Miłego dnia
Abdul Mueid
1
Co zrobiłeś, aby naprawić nierówny dźwięk?
NoBugs,
To jest bardzo niepewne. Czy musimy podkręcać pi?
b-ak
1
Instrukcje Abdula działają idealnie, jednak wyjście audio przez głośnik BT jest bardzo niepewne. W każdym razie nie jest to akceptowalna jakość dźwięku. Natywny dźwięk PI za pośrednictwem Pulseaudio jest bardzo gówniany. Czas na znacznie lepsze rozwiązanie niż Bluetooth.
Don Allen
0

Czy zanim zacząłeś tę trasę, zastanawiałeś się nad wyjątkowo niską jakością wyjścia audio jack RPi 3,5 mm?

Wyjście dźwięku Raspberry Pi

Może dlatego nie możesz znaleźć aktualnego samouczka.

Szczerze mówiąc, innym powodem może być to, że przyzwoita para głośników jest nie mniej niż droższa niż przyzwoity głośnik Bluetooth. Nie poszedłbym tą drogą, chyba że masz zamiar zainwestować także w kartę dźwiękową USB (nie drogo, ale twoja łączna cena zaczyna teraz rosnąć). A może planujesz użyć wyjścia HDMI? To jest naprawdę bardzo dobre.

Co powiesz na ten? Wszystkie elementy powinny być łatwo dostępne.

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

To był mój pierwszy projekt RPi. Nie szukałem bardzo dokładnie, ale uważam, że komponentu MPD można używać do przesyłania strumieniowego Bluetooth do RPi. Zostawię cię do przeprowadzenia tych badań.

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

KDM
źródło
Zgadzam się z tobą, że istnieją lepsze gotowe rozwiązania, które nie są tak drogie, ale chcę, aby było to częścią większego projektu
gtatr
Spekuluję tylko na temat przyczyn starszych instrukcji. Zobacz jednak inne uwagi na temat potencjalnych rozwiązań. Spójrz na demona MPD. Mogę się mylić, ale myślę, że może przesyłać strumieniowo Bt. Przydałoby się trochę więcej szczegółów. Jeśli zamierzasz korzystać z gniazda audio 3,5 mm, prawdopodobnie będzie działać dobrze przy 75%, ale będziesz musiał polegać na zewnętrznym wzmacniaczu do kontroli głośności.
KDM
btw Próbowałem tego samouczka, a także prawie każdego innego samouczka online, ale bezskutecznie
gtatr