Configura Raspberry Pi 3 come altoparlante bluetooth


36

Sto cercando un modo per configurare Raspberry Pi 3 come altoparlante bluetooth usando Raspbian Jessie. Ciò che intendo come altoparlante bluetooth è usarlo per ricevere streaming audio tramite bluetooth utilizzando A2DP e riprodurlo tramite altoparlanti collegati al Raspberry Pi tramite la presa audio, la porta HDMI o l'adattatore audio USB.

Diversi tutorial sono disponibili online ma sono abbastanza obsoleti e la maggior parte di essi non funziona più.


Non è chiaro cosa intendi per "come altoparlante bluetooth"
Milliways,

1
Modificato. La speranza è chiara ora
gtatr

Perfettamente chiaro per me, sono interessato a leggere qualsiasi risposta reale.
Burt_Harris,

La soluzione votata è una strada simile con cui ho finito. Tuttavia, ho un repository github che lo configurerà per te su una nuova installazione di raspbian Jessie Lite (incerto se funziona senza un po 'di configurazione per Jessie con pixel), segui semplicemente le istruzioni di installazione qui: github.com/bareinhard/… . Il problema principale che vedo con le soluzioni esistenti è che usano pulseaudio5 per impostazione predefinita. Questo compilerà pa6 e eliminerà molti problemi di riproduzione che sperimenta pa5.
Brett Reinhard,

Risposte:


25

Sono stato su questo progetto dopo un po '(per aiutare il mio amico a fare il loro giornale per laurearsi) e ho trovato il progetto online che stava andando bene (anche se l'elaborazione pi l'audio è abbastanza in ritardo rispetto al pi, e la caduta di tensione lo rende congelare come l'unico modo per riavviare è scollegare il cavo di alimentazione).

Questo è il passo su cui ho lavorato e funziona su raspberry pi 3.

1. Scarica il pacchetto richiesto

Questo progetto dipende da pulseaudio, quindi prendilo e installalo digitando:

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

preferisco aggiornare il firmware di Raspberry prima di installarli perché ho problemi con il rpi-bluetoothpacchetto, quindi faccio:

sudo rpi-update

e fallo installare e passa al passaggio successivo.

2. Modifica configurazione e applicata

Per prima cosa aggiungi pi username al gruppo pulseaudio con

sudo usermod -a -G lp pi

crea una nuova configurazione in /etc/bluetooth/audio.conf usando l'editor di testo e aggiungi la seguente riga

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

modifica il file /etc/bluetooth/main.confusando il tuo editor di testo preferito (sto usando nano).

Imposta la classe Bluetooth, modifica la seguente riga su:

 Class = 0x00041C

0x000041C significa che il protocollo Bluetooth Bluetooth rpi supporta il protocollo A2DP.

cambia /etc/pulse/daemon.conf aggiungi / modifica (non dimenticare di controllare accuratamente il codice prima di aggiungerli) e cambia

resample-method = trivial

puoi usare qualsiasi metodo che ti piace, io personalmente usando speex-float-3come riferimento puoi vedere questo link

avviare il servizio pulseaudio con:

pulseaudio -D

useremo lo script ragusa87 per automatizzare la sorgente bluetooth sul sink audio. Innanzitutto, aggiungi una nuova configurazione a udev init.d modificando il file /etc/udev/rules.d/99-input.rulese aggiungilo al file

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

Aggiungi cartella udevalla /usr/libutilizzando mkdir

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

e aggiungilo al file bluetooth (credits 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

Si prega di notare che il vostro AUDIOSINK potrebbe essere diverso dal mio, verificarlo prima dell'uso pactl list short sinks

rendere eseguibile lo script inserendo questo codice

chmod 777 bluetooth 

collegare l'auricolare per verificare se il jack audio funziona e verificare

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

oppure puoi impostare il routing audio predefinito con

sudo amixer cset numid = 3 n

dove n potrebbe essere: 0 = auto 1 = jack 2 = hdmi

3. Associare e collegare l'audio

vai al terminale e digita bluetoothctl. Prima attiva il bluetooth con power one poi agent on, imposta l'agente predefinito che hai modificato in precedenza con default-agent, quindi imposta la modalità rilevabile e la modalità di accoppiamento con discoverable on; pairable on. Dovresti vedere raspberrypi bluetooth sul tuo telefono o laptop e puoi accoppiarlo sul telefono facendo clic su di esso e tocca accoppia. Sul terminale si digita y. Tornando al terminale, ti colleghi al telefono per tipo connect xx:xx:xx:xx:xx:xxdove xx:xx:xx:xx:xx:xx è il tuo indirizzo mac bluetooth del telefono. e non dimenticare di fidarti del trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxtuo indirizzo mac bluetooth del tuo telefono E voilà hai un amplificatore bluetooth (o qualunque sia il nome) usando raspberry.

4. Conclusione

dopo aver provato e sperimentato, ho scoperto che la qualità dell'audio è bassa e preferisco non usarla poiché il lampone si bloccherà se lo usi con la canzone in streaming sul lampone. Consiglio di utilizzare il progetto di altoparlanti UPNP usando gmediarenderer. L'audio è superbo e non c'è ritardo e suono scatter e può riprodurre file audio lossless (flac, wav, dll). Questo è il dettagliato come installarlo

riferimento: tutorial di jobpassion ; la sceneggiatura di ragusa ; lavoro correlato ;


Non sono in grado di eseguire sudo service pulseaudio restart, sto ottenendoFailed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr

Inoltre, con bluetoothctlcui lo faccio connect xx:xx:xx:xx:xx:xxio vengo Failed to connect: org.bluez.Error.Failedutilizzando il telefono o computer portatile
gtatr

Che sistema operativo stai usando? L'unico sistema operativo che supporta il bluetooth integrato di raspberry pi 3 è raspbian Jessie e Ubuntu Mate> 16.04. Sul Ubuntu Mate bluetooth a2dp è già presente, quindi è possibile verificarlo su Bluetooth Manager.
x

Se hai già provato qualche tutorial online e fai casino, penso che sia meglio reinstallare e cancellare la configurazione dei pacchetti. Ho pasticciato con i pacchetti Bluetooth installando manualmente il pacchetto 'rpi-bluetooth' e il Bluetooth non funziona. Quindi ho riflash l'immagine raspbian e funziona bene anche se il suono non è piacevole IMO.
x

Sto usando una raspbian Jessie appena installata e seguivo le tue istruzioni passo dopo passo, forse c'è un passaggio mancante proveniente da un sistema operativo appena installato. Potrei provare Ubuntu Mate
gtatr

16

Ecco una soluzione alternativa che non si basa su PulseAudio: https://github.com/lukasjapan/bt-speaker

Installa su raspbian come root con:

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

Avvierà un demone speaker bluetooth che accetta automaticamente un singolo client per A2DP / AVRCP e reindirizza il flusso audio direttamente ad ALSA.


Promemoria per la sicurezza: ho scritto la sceneggiatura da solo, così posso assicurarvi che è sicuro, ma per favore verificate il contenuto da soli
Lukas

simpatico! Proverò a testarlo nei prossimi giorni
gtatr

1
stavo provando la tua soluzione, e ha funzionato ma l'audio si è bloccato ogni secondo. perché sta succedendo?
Wolfram77,

Molto probabilmente il problema di Wifi: github.com/lukasjapan/bt-speaker/issues/4
Lukas

3

Ho scritto istruzioni succinte per Raspberry Pi 3 sul mio blog . La maggior parte delle istruzioni online sono per le versioni precedenti di Debian / Xbian. Ecco le istruzioni che ho testato e sto lavorando su Raspberry Pi 3 con Xbian.

  1. Inizia installando / aggiornando tutti i pacchetti

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. Aggiungi utenti ai gruppi. Questo è molto importante. Se usi un'altra distribuzione, sostituisci "xbian" con il tuo nome utente.

    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. Configurare PulseAudio e la classe di dispositivi 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
    

Il servizio Bluetooth / classe dispositivo 0x200420 indica che il dispositivo è impostato per Car Audio. Vedi questo link per esplorare altre opzioni di classe Bluetooth.

  1. Per accoppiare un dispositivo, dovremo utilizzare lo strumento "bluetoothctl".

    sudo bluetoothctl
    
  2. Impostare l'agente su KeyboardOnly e impostarlo come predefinito. Questo deve essere fatto solo una volta. All'interno di bluetoothctl, esegui i seguenti comandi:

    agent KeyboardOnly
    default-agent
    
  3. Attiva il bluetooth sul tuo telefono / tablet e assicurati che sia rilevabile. Esegui i seguenti comandi all'interno di bluetoothctl:

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

    xx: xx: xx: .. è l'indirizzo MAC del telefono / dispositivo. Dopo aver eseguito 'scan on', attendi un minuto che il tuo dispositivo venga visualizzato insieme al suo indirizzo MAC. Dopo aver eseguito 'accoppia xx: xx: xx: ..' controlla il tuo dispositivo e accetta la connessione in entrata. Fai lo stesso sul terminale digitando yes.

  4. Ora connettiti a Raspberry Pi dal tuo telefono e dovrebbe connettersi come dispositivo audio. Tutto l'audio riprodotto attraverso il dispositivo dovrebbe ora essere emesso utilizzando l'uscita HDMI o analogica di Raspberry Pi a seconda della configurazione del Pi.

  5. Se la connessione non riesce, riprovare, a volte sono necessari 2 tentativi.


Grazie per il tempo dedicato a rispondere. Le risposte solo al collegamento sono scoraggiate poiché non si può dire cosa c'è dall'altra parte - se l'articolo collegato cambia o scompare, così fa questa risposta. Puoi riassumere i punti importanti?
goobering

@goobering: post aggiornato. Non ho molta familiarità con la formattazione sui siti Stack ma l'ho fatto al meglio delle mie capacità. Grazie per aver dedicato del tempo a rivedere la mia risposta. Buona giornata
Abdul Mueid,

1
Cosa hai fatto per correggere l'audio discontinuo?
NoBugs,

È super mosso. Dobbiamo overcloccare il pi?
martedì

1
Le istruzioni di Abdul funzionano perfettamente, tuttavia l'uscita audio attraverso l'altoparlante BT è molto discontinua. Questa non è una qualità audio accettabile in ogni caso. L'audio nativo PI tramite Pulseaudio è molto scadente. Tempo per una soluzione molto migliore di Bluetooth.
Don Allen,

0

Prima di lanciarti lungo quel percorso, hai considerato la notoriamente scarsa qualità dell'uscita jack audio da 3,5 mm RPi?

Uscita audio di Raspberry Pi

Questo potrebbe essere il motivo per cui non riesci a trovare un tutorial aggiornato.

Per essere onesti, l'altro motivo potrebbe essere che un discreto paio di altoparlanti non è meno costoso di un discreto altoparlante Bluetooth. Non seguirei questa strada, a meno che la tua intenzione non sia anche quella di investire in una scheda audio USB (non costosa, ma il tuo prezzo totale sta iniziando ad aumentare ora). Oppure, hai intenzione di utilizzare l'uscita HDMI? È davvero molto buono.

Che ne dici di questo? Tutti i componenti dovrebbero essere prontamente disponibili.

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

Questo è stato il mio primo progetto RPi. Non ho guardato molto bene, ma credo che il componente MPD possa essere usato per trasmettere Bluetooth su RPi. Ti lascio fare questa ricerca.

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


Sono d'accordo con te sul fatto che ci sono soluzioni pronte migliori là fuori, e non così costose, ma voglio che questo faccia parte di un progetto più ampio
gtatr

Io speculo solo sui motivi delle istruzioni per anziani. Vedi altre note, tuttavia, su potenziali soluzioni. Guarda il demone MPD. Potrei sbagliarmi, ma penso che possa trasmettere Bt. Potrebbe usare un po 'più di dettagli. Se utilizzerai il jack audio da 3,5 mm, probabilmente funzionerà bene al 75%, ma dovrai fare affidamento su un amplificatore esterno per il controllo del volume.
KDM,

a proposito ho provato quel tutorial, più quasi ogni altro tutorial online ma senza successo
GTatr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.