Configurar Raspberry Pi 3 como altavoz bluetooth

36

Estoy buscando una manera de configurar el Raspberry Pi 3 como altavoz bluetooth usando Raspbian Jessie. Lo que quiero decir con altavoz bluetooth es usarlo para recibir transmisión de audio a través de bluetooth usando A2DP y reproducirlo a través de altavoces conectados al Raspberry Pi a través del conector de audio, el puerto HDMI o el adaptador de audio USB.

Hay diferentes tutoriales disponibles en línea, pero están bastante desactualizados y la mayoría de ellos ya no funciona.

gtatr
fuente
No está claro qué quiere decir con "como altavoz bluetooth"
Milliways
1
Editado La esperanza está clara ahora
gtatr
Perfectamente claro para mí, estoy interesado en leer cualquier respuesta real.
Burt_Harris
La solución votada es una ruta similar con la que terminé yendo. Sin embargo, tengo un repositorio de github que lo configurará para usted en una nueva instalación de raspbian Jessie Lite (no estoy seguro si funciona sin una pequeña configuración para Jessie con píxeles) simplemente siga las instrucciones de instalación aquí: github.com/bareinhard/… . El principal problema que veo con las soluciones existentes es que usan pulseaudio5 por defecto. Esto compilará pa6 y eliminará muchos problemas de reproducción que pa5 experimenta.
Brett Reinhard

Respuestas:

25

He estado en este proyecto después de un tiempo (para ayudar a mi amigo a hacer su trabajo para graduarse) y encuentro que el proyecto en línea funciona bien (aunque el procesamiento pi del audio está bastante rezagado y la caída de voltaje hace que se congele como la única forma hacer que se reinicie es desconectar el cable de alimentación).

Este es el paso en el que he estado trabajando y funciona en raspberry pi 3.

1. Descargue el paquete requerido

Este proyecto depende de pulseaudio, así que tómalo e instálalo escribiendo:

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

prefiero actualizar el firmware de la frambuesa antes de instalarlos porque tengo un problema con el rpi-bluetoothpaquete, así que hago:

sudo rpi-update

y haga que se instale y avance al siguiente paso.

2. Edite la configuración y la aplicó

Primero agregue el nombre de usuario pi al grupo pulseaudio con

sudo usermod -a -G lp pi

cree una nueva configuración en /etc/bluetooth/audio.conf usando el editor de texto y agregue la siguiente línea

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

edite el archivo /etc/bluetooth/main.confusando su editor de texto preferido (estoy usando nano).

Configure la clase Bluetooth, modifique la siguiente línea para:

 Class = 0x00041C

0x000041C significa que el bluetooth rpi admite el protocolo A2DP.

cambie /etc/pulse/daemon.conf agregar / modificar (no olvide verificar el código a fondo antes de agregarlos), y cambie

resample-method = trivial

puede usar cualquier método que desee, personalmente lo uso speex-float-3como referencia, puede ver este enlace

iniciar el servicio pulseaudio con:

pulseaudio -D

vamos a usar el script ragusa87 para automatizar la fuente de bluetooth para hundir el audio. Primero, agregue una nueva configuración a udev init.d editando el archivo /etc/udev/rules.d/99-input.rulesy agréguelo al archivo

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

agregar carpeta udeva /usr/libmediante mkdir

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

y agregue esto al archivo bluetooth (créditos 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

TENGA EN CUENTA que su AUDIOSINK puede ser diferente al mío, verifíquelo antes de usar pactl list short sinks

hacer que el script sea ejecutable ingresando este código

chmod 777 bluetooth 

conecte los auriculares para probar si el conector de audio funciona y pruebe con

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

o puede configurar el enrutamiento de audio predeterminado con

sudo amixer cset numid = 3 n

donde n podría ser: 0 = auto 1 = jack 2 = hdmi

3. Empareja y conecta el audio

ir a la terminal y escribir bluetoothctl. Primero active bluetooth con power ony luego agent on, configure el agente predeterminado con el que ha estado editando anteriormente default-agent, y luego configure el modo reconocible y el modo de emparejamiento con discoverable on; pairable on. Debería ver bluetooth raspberrypi en su teléfono o computadora portátil y puede emparejarlo en el teléfono haciendo clic en él y tocando emparejar. En la terminal escribes y. De vuelta al terminal, te conectas al teléfono por tipo connect xx:xx:xx:xx:xx:xxdonde xx:xx:xx:xx:xx:xx es la dirección mac de tu teléfono bluetooth. y no te olvides de confiar en trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxla dirección mac de tu teléfono bluetooth. Y listo, tienes un amplificador bluetooth (o como se llame) usando frambuesa.

4. Conclusión

después de probar y experimentar, descubrí que la calidad de audio es baja y prefiero no usarla, ya que la frambuesa se congelará si la usa con la canción que se transmite a la frambuesa. Aconsejo usar el proyecto de altavoz UPNP usando gmediarenderer. El audio es excelente y no hay sonido de retraso y dispersión y puede reproducir archivos de audio sin pérdidas (flac, wav, dll). Este es el detallado cómo configurarlo

referencia: tutorial de jobpassion ; guión de ragusa ; trabajo relacionado ;

xdhe
fuente
No puedo ejecutar sudo service pulseaudio restart, estoy obteniendoFailed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr
Además, bluetoothctlcuando lo hago connect xx:xx:xx:xx:xx:xx, Failed to connect: org.bluez.Error.Faileduso mi teléfono o mi computadora portátil
gtatr
¿Qué os estás usando? El único sistema operativo que admite bluetooth integrado de raspberry pi 3 es el raspbian Jessie y Ubuntu Mate> 16.04. En Ubuntu Mate bluetooth a2dp ya está presente, por lo que puede verificarlo en Bluetooth Manager.
xdhe
Si ya has probado algún tutorial en línea y te equivocas, creo que es mejor reinstalar y purgar la configuración de los paquetes. Me he metido con los paquetes de Bluetooth instalando manualmente el paquete 'rpi-bluetooth' y el Bluetooth no funciona. Así que volví a flashear la imagen raspbian y funciona bien, aunque el sonido no es agradable en mi opinión.
xdhe
Estoy usando un raspbian Jessie recién instalado, y seguí sus instrucciones paso a paso, tal vez falte un paso proveniente de un SO recién instalado. Podría probar Ubuntu Mate
gtatr
16

Aquí hay una solución alternativa que no se basa en PulseAudio: https://github.com/lukasjapan/bt-speaker

Instalar en raspbian como root con:

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

Se iniciará un demonio de altavoz bluetooth que acepta automáticamente un solo cliente para A2DP / AVRCP y canaliza el flujo de audio directamente a ALSA.

Lukas
fuente
Recordatorio de seguridad: escribí el guión por mí mismo para asegurarle que es seguro, pero verifique el contenido usted mismo
Lukas
¡bonito! Intentaré probar esto en los próximos días
gtatr
1
Estaba probando su solución, y funcionó, pero el audio se atascó cada dos segundos. ¿Por qué está pasando esto?
wolfram77
Lo más probable es el problema de Wifi: github.com/lukasjapan/bt-speaker/issues/4
Lukas
3

He escrito instrucciones breves para Raspberry Pi 3 en mi blog . La mayoría de las instrucciones en línea son para versiones anteriores de Debian / Xbian. Aquí están las instrucciones que he probado y estoy trabajando en Raspberry Pi 3 con Xbian.

  1. Comience instalando / actualizando todos los paquetes

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. Agregar usuarios a grupos. Esto es muy importante. Si usa cualquier otra distribución, reemplace 'xbian' con su nombre de usuario.

    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. Configurar PulseAudio y la clase de dispositivo 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
    

El servicio Bluetooth / clase de dispositivo 0x200420 significa que el dispositivo está configurado para Car Audio. Vea este enlace para explorar más opciones de Clase Bluetooth.

  1. Para emparejar con un dispositivo, necesitaremos usar la herramienta "bluetoothctl".

    sudo bluetoothctl
    
  2. Configure el agente en KeyboardOnly y hágalo predeterminado. Esto debe hacerse solo una vez. Dentro de bluetoothctl, ejecute los siguientes comandos:

    agent KeyboardOnly
    default-agent
    
  3. Active bluetooth en su teléfono / tableta y asegúrese de que sea reconocible. Ejecute los siguientes comandos dentro de bluetoothctl:

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

    xx: xx: xx: .. es la dirección MAC de su teléfono / dispositivo. Después de ejecutar 'scan on', espere un minuto para que su dispositivo aparezca junto con su dirección MAC. Después de ejecutar 'pair xx: xx: xx: ..' verifique su dispositivo y acepte la conexión entrante. Haga lo mismo en la terminal escribiendo yes.

  4. Ahora conéctese a la Raspberry Pi desde su teléfono y debería conectarse como un dispositivo de audio. Todo el audio que se reproduce a través del dispositivo ahora se debe emitir utilizando HDMI o salida analógica de Raspberry Pi, según la configuración de su Pi.

  5. Si la conexión falla, intente nuevamente, a veces toma 2 intentos.

Abdul Mueid
fuente
Gracias por tomarte el tiempo de responder. Se desaconsejan las respuestas de solo enlace, ya que no se sabe qué hay en el otro extremo; si el artículo vinculado cambia o desaparece, también lo hace esta respuesta. ¿Puedes resumir los puntos importantes?
goobering
@goobering: publicación actualizada. No estoy muy familiarizado con el formato en los sitios de Stack, pero lo he hecho lo mejor que he podido. Gracias por tomarse el tiempo de revisar mi respuesta. Que tenga un gran día
Abdul Mueid
1
¿Qué hiciste para arreglar el audio entrecortado?
NoBugs
Es super picado. ¿Tenemos que overclockear el pi?
b-ak
1
Las instrucciones de Abdul funcionan perfectamente, sin embargo, la salida de audio a través del altavoz BT es muy entrecortada. Esto no es una calidad de audio aceptable en ningún caso. El audio nativo de PI a través de Pulseaudio es muy malo. Es hora de una solución mucho mejor que Bluetooth.
Don Allen
0

Antes de lanzarse por esa ruta, ¿ha considerado la calidad notoriamente pobre de la salida de conector de audio RPi de 3.5 mm?

Salida de sonido de la Raspberry Pi

Esta puede ser la razón por la que no puede encontrar un tutorial actualizado.

Para ser justos, la otra razón podría ser que un par de parlantes decentes no es menos costoso que un parlante Bluetooth decente. No seguiría esta ruta, a menos que su intención sea invertir también en una tarjeta de sonido USB (no es costosa, pero su precio total está comenzando a aumentar ahora). ¿O tal vez planeas usar la salida HDMI? Es realmente muy bueno.

¿Que tal este? Todos los componentes deben estar fácilmente disponibles.

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

Este fue mi primer proyecto RPi. No he mirado a fondo, pero creo que el componente MPD se puede usar para transmitir Bluetooth al RPi. Te dejo para que hagas esa investigación.

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

KDM
fuente
Estoy de acuerdo con usted en el hecho de que hay mejores soluciones listas por ahí, y no tan caro, pero yo quiero que esto sea parte de un proyecto más amplio
gtatr
Solo especulo sobre las razones de las instrucciones para ancianos. Ver otras notas, sin embargo, sobre posibles soluciones. Mira el demonio MPD. Puedo estar equivocado, pero creo que puede transmitir Bt. Podría usar un poco más de detalle. Si va a utilizar el conector de audio de 3.5 mm, probablemente funcionará bien al 75%, pero deberá confiar en un amplificador externo para el control de volumen.
KDM
por cierto probé ese tutorial, más casi cualquier otro tutorial en línea pero sin éxito
gtatr