Configuration de Raspberry Pi 3 en tant que haut-parleur Bluetooth

36

Je cherche un moyen de configurer le Raspberry Pi 3 en tant que haut-parleur Bluetooth à l’aide de Raspbian Jessie. Ce que je veux dire par haut - parleur Bluetooth est de l'utiliser pour recevoir un flux audio via Bluetooth en utilisant A2DP et de le lire via des haut-parleurs connectés au Raspberry Pi via la prise audio, le port HDMI ou l'adaptateur audio USB.

Différents didacticiels sont disponibles en ligne mais sont assez obsolètes et la plupart d'entre eux ne fonctionnent plus.

gtatr
la source
Ce que vous entendez par "en tant que haut-parleur bluetooth" n'est pas clair
Milliways
1
Édité. L'espoir est clair maintenant
mardi
Parfaitement clair pour moi, je suis intéressé à lire de vraies réponses.
Burt_Harris
La solution votée est un itinéraire similaire, j'ai fini par aller avec. Cependant, j’ai un repo github qui le configurera pour une nouvelle installation de Raspbian Jessie Lite (ne sachant pas si cela fonctionne sans une petite configuration pour Jessie avec pixel), suivez simplement les instructions d’installation ici: github.com/bareinhard/… . Le problème principal que je vois avec les solutions existantes est qu’elles utilisent pulseaudio5 par défaut. Ceci compilera pa6 et résoudra de nombreux problèmes de lecture rencontrés par pa5.
Brett Reinhard

Réponses:

25

Je suis sur ce projet après un certain temps (pour aider mon ami à préparer son mémoire) et je trouve que le projet en ligne se passe bien (bien que le traitement audio de l’audio soit assez en retard sur celui-ci, la chute de tension le bloque comme seul moyen) pour le faire redémarrer, c'est débrancher le câble d'alimentation).

C’est l’étape sur laquelle j’ai travaillé et cela fonctionne sur framboise pi 3.

1. Téléchargez le package requis

Ce projet dépend de pulseaudio alors saisissez-le et installez-le en tapant:

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

Je préfère mettre à jour le firmware de Raspberry avant de les installer car j'ai un problème avec le rpi-bluetoothpaquet, donc je le fais:

sudo rpi-update

et le faire installer et passer à l'étape suivante.

2. Modifier la configuration et l'appliquer

Ajoutez d’abord le nom d’utilisateur pi au groupe pulseaudio avec

sudo usermod -a -G lp pi

créez une nouvelle configuration sous /etc/bluetooth/audio.conf à l'aide de l'éditeur de texte et ajoutez la ligne suivante

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

modifier le fichier en /etc/bluetooth/main.confutilisant votre éditeur de texte préféré (j'utilise nano).

Définir la classe Bluetooth, Modifiez la ligne suivante en:

 Class = 0x00041C

0x000041C signifie que le protocole A2DP de rpi bluetooth est supporté.

changer /etc/pulse/daemon.conf ajouter / modifier (n'oubliez pas de vérifier le code soigneusement avant de les ajouter), et changer

resample-method = trivial

vous pouvez utiliser n'importe quelle méthode, j'utilise personnellement speex-float-3pour référence, vous pouvez voir ce lien

démarrez le service pulseaudio avec:

pulseaudio -D

nous allons utiliser le script ragusa87 pour automatiser la source Bluetooth vers le récepteur audio. Commencez par ajouter une nouvelle configuration à udev init.d en modifiant le fichier, /etc/udev/rules.d/99-input.rulespuis ajoutez-le au fichier.

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

ajouter un dossier udevà l' /usr/libaide de mkdir

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

et ajoutez ceci au fichier bluetooth (crédits 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

VEUILLEZ NOTER que votre AUDIOSINK peut être différent du mien, vérifiez-le avant d'utiliser pactl list short sinks

rendre le script exécutable en entrant ce code

chmod 777 bluetooth 

branchez le casque pour vérifier si la prise audio fonctionne et testez-le avec

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

ou vous pouvez définir le routage audio par défaut avec

sudo amixer cset numid = 3 n

où n pourrait être: 0 = auto 1 = prise 2 = hdmi

3. Associez et connectez l'audio

allez au terminal et tapez bluetoothctl. Activez d'abord Bluetooth avec power on, puis agent ondéfinissez l'agent par défaut que vous avez déjà modifié default-agent, puis activez le mode détectable et le mode de couplage discoverable on; pairable on. Vous devez voir Bluetooth Bluetooth framboise sur votre téléphone ou votre ordinateur portable. Vous pouvez le coupler au téléphone en cliquant dessus, puis en appuyant sur paire. Sur le terminal, vous tapez y. De retour au terminal, vous vous connectez au téléphone par type, connect xx:xx:xx:xx:xx:xxxx:xx:xx:xx:xx:xx est l'adresse mac Bluetooth de votre téléphone. et n'oubliez pas de faire confiance à trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxvotre téléphone adresse bluetooth mac mac Et voila vous avez un amplificateur bluetooth (ou quel que soit son nom) en utilisant framboise.

4. Conclusion

Après avoir essayé et expérimenté, j'ai découvert que la qualité audio était basse et que je ne l'utilisais pas, car le frambois serait gelé si vous l'utilisiez avec la chanson en streaming sur le frambois. Je conseille d'utiliser le projet de haut-parleur UPNP en utilisant gmediarenderer. L'audio est superbe et il n'y a pas de retard et de dispersion du son et il peut lire des fichiers audio sans perte (flac, wav, dll). C'est le détail comment le configurer

référence: tutoriel de jobpassion ; le script de ragusa ; travaux connexes ;

Xdhe
la source
Je ne suis pas en mesure d'exécuter sudo service pulseaudio restart, je reçoisFailed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr
De plus, bluetoothctlquand je le fais, connect xx:xx:xx:xx:xx:xxje me Failed to connect: org.bluez.Error.Failedsers de mon téléphone ou de mon ordinateur portable
jeudi
Qu'est-ce que vous utilisez? Jessie et Ubuntu Mate> 16.04 sont les seuls logiciels compatibles avec raspberry pi 3 à bord du bluetooth. Sur le Ubuntu Mate, le bluetooth a2dp est déjà présent, vous pouvez donc le vérifier sur Bluetooth Manager.
xdhe
Si vous avez déjà essayé un didacticiel en ligne et que vous avez tout gâché, je pense qu'il est préférable de réinstaller et de purger la configuration des paquets. J'ai manipulé les paquets Bluetooth en installant manuellement le paquet 'rpi-bluetooth' et le Bluetooth ne fonctionne pas. Donc, j'ai reflash image raspbian et cela fonctionne très bien même si le son n'est pas agréable OMI.
xdhe
J'utilise une Jessie raspbian fraîchement installée et je suivais vos instructions pas à pas. Il manque peut-être une étape d'un système d'exploitation fraîchement installé. Je pourrais essayer Ubuntu Mate
mercredi
16

Voici une solution alternative qui ne repose pas sur PulseAudio: https://github.com/lukasjapan/bt-speaker

Installer sur raspbian en tant que root avec:

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

Il va démarrer un démon de haut-parleur bluetooth qui accepte automatiquement un seul client pour A2DP / AVRCP et dirige le flux audio directement vers ALSA.

Lukas
la source
Rappel de sécurité: J'ai écrit le script moi-même pour que je puisse vous assurer qu'il est sécurisé, mais veuillez en vérifier le contenu vous
Lukas
agréable! J'essaierai de le tester dans les prochains jours
mardi
1
J'essayais votre solution, et cela a fonctionné, mais l'audio est bloqué toutes les deux secondes. Pourquoi cela arrive-t-il?
Wolfram77
Probablement le problème du Wifi: github.com/lukasjapan/bt-speaker/issues/4
Lukas
3

J'ai écrit des instructions succinctes pour le Raspberry Pi 3 sur mon blog . La plupart des instructions en ligne concernent les anciennes versions de Debian / Xbian. Voici les instructions que j'ai testées et qui fonctionnent sur Raspberry Pi 3 avec Xbian.

  1. Commencez par installer / mettre à jour tous les paquets

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. Ajouter des utilisateurs aux groupes. C'est très important. Si vous utilisez une autre distribution, remplacez "xbian" par votre nom d'utilisateur.

    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. Configurer PulseAudio & 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
    

La classe de service / périphérique Bluetooth 0x200420 signifie que le périphérique est configuré pour Car Audio. Voir ce lien pour explorer plus d'options de classe Bluetooth.

  1. Pour coupler un appareil, nous devrons utiliser l'outil «bluetoothctl».

    sudo bluetoothctl
    
  2. Définissez l'agent sur KeyboardOnly et définissez-le par défaut. Cela doit être fait une fois seulement. Dans bluetoothctl, exécutez les commandes suivantes:

    agent KeyboardOnly
    default-agent
    
  3. Activez Bluetooth sur votre téléphone / tablette et assurez-vous qu'il est détectable. Exécutez les commandes suivantes dans bluetoothctl:

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

    xx: xx: xx: .. est l'adresse MAC de votre combiné / appareil. Après avoir lancé l'analyse, attendez une minute que votre appareil apparaisse avec son adresse MAC. Après avoir exécuté 'pair xx: xx: xx: ..', vérifiez votre appareil et acceptez la connexion entrante. Faites la même chose sur le terminal en tapant oui.

  4. Maintenant, connectez-vous au Raspberry Pi à partir de votre téléphone et il devrait se connecter en tant que périphérique audio. Tout l'audio lu par le périphérique doit maintenant être transmis via la sortie HDMI ou analogique de Raspberry Pi, selon la configuration de votre Pi.

  5. Si la connexion échoue, réessayez. Parfois, il faut 2 tentatives.

Abdul Mueid
la source
Merci d'avoir pris le temps de répondre. Les réponses en lien uniquement sont découragées, car rien ne permet de savoir ce qui se trouve de l'autre côté. Si l'article lié change ou disparaît, la réponse en fait de même. Pouvez-vous résumer les points importants?
Goobering
@goobering: Poster mis à jour. Je ne connais pas trop le formatage sur les sites Stack, mais je l’ai fait de mon mieux. Merci d'avoir pris le temps de revoir ma réponse. Passez une bonne journée
Abdul Mueid
1
Qu'avez-vous fait pour réparer l'audio instable?
NoBugs
C'est très agité. Devons-nous overclocker le pi?
b-ak
1
Les instructions d'Abdul fonctionnent parfaitement, mais la sortie audio via le haut-parleur BT est très instable. Ce n'est pas une qualité audio acceptable dans tous les cas. L’audio native PI via Pulseaudio est très nul. Temps pour une solution bien meilleure que Bluetooth.
Don Allen
0

Avant de vous lancer dans cette voie, avez-vous considéré la qualité notoirement mauvaise de la sortie de la prise audio RPi 3,5 mm?

Sortie sonore du Raspberry Pi

C'est peut-être pour cette raison que vous ne trouvez pas de didacticiel à jour.

Pour être juste, l'autre raison pourrait être qu'une paire de haut-parleurs décent n'est pas moins chère qu'un haut-parleur Bluetooth décent. Je n'irais pas dans cette voie, à moins que votre intention soit d'investir également dans une carte son USB (pas cher, mais votre prix total commence à augmenter maintenant). Ou peut-être envisagez-vous d'utiliser la sortie HDMI? C'est vraiment très bien.

Celui-ci, ça va? Tous les composants doivent être facilement disponibles.

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

C'était mon premier projet RPi. Je n'ai pas examiné très attentivement, mais je pense que le composant MPD peut être utilisé pour diffuser Bluetooth via le RPi. Je vous laisse faire cette recherche.

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

KDM
la source
Je suis d'accord avec vous sur le fait qu'il existe de meilleures solutions prêtes à l'emploi, et que cela ne coûte pas si cher, mais je souhaite que cela fasse partie d'un projet plus vaste
dimanche
Je ne fais que spéculer sur les raisons des instructions données aux personnes âgées. Voir les autres notes, cependant, sur les solutions potentielles. Regardez le démon MPD. Je me trompe peut-être, mais je pense qu'il peut couler Bt. Pourrait utiliser un peu plus de détails. Si vous utilisez la prise audio 3,5 mm, cela fonctionnera probablement bien à 75%, mais vous devrez vous fier à un amplificateur externe pour le contrôle du volume.
KDM
btw, j'ai essayé ce tutoriel, ainsi que presque tout autre tutoriel en ligne, mais sans succès
mercredi