Настройка Raspberry Pi 3 в качестве динамика Bluetooth

36

Я ищу способ настроить Raspberry Pi 3 в качестве динамика Bluetooth, используя Raspbian Jessie. Под bluetooth-динамиком я подразумеваю, что он используется для получения аудиопотока через Bluetooth с использованием A2DP и ​​воспроизведения через динамики, подключенные к Raspberry Pi через аудиоразъем, порт HDMI или аудио-адаптер USB.

В Интернете доступны различные учебники, но они устарели, и большинство из них больше не работает.

gtatr
источник
Непонятно, что вы подразумеваете под «как динамик Bluetooth»
Milliways
1
Ред. Надежда теперь ясна
gtatr
Совершенно понятно для меня, мне интересно читать любые реальные ответы.
Burt_Harris
Решение, за которое проголосовали, - это аналогичный маршрут, по которому я закончил. Тем не менее, у меня есть репозиторий github, который настроит это для вас на новой установке raspbian Jessie Lite (не уверен, что он работает без небольшой конфигурации для Jessie с pixel), просто следуйте инструкциям по установке здесь: github.com/bareinhard/… , Основная проблема, которую я вижу с существующими решениями, состоит в том, что они используют pulseaudio5 по умолчанию. Это скомпилирует pa6 и избавит от множества проблем с воспроизведением, с которыми сталкивается pa5.
Бретт Рейнхард

Ответы:

25

Я был над этим проектом через некоторое время (чтобы помочь моему другу в подготовке к выпуску) и нашел, что онлайн-проект работает нормально (хотя пи, обрабатывающая звук, довольно сильно отстает от пи, и падение напряжения заставляет его зависать как единственный способ перезагрузить - отключить кабель питания).

Это шаг, над которым я работал, и он работает на 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 с помощью

sudo usermod -a -G lp pi

создайте новый конфиг в /etc/bluetooth/audio.conf с помощью текстового редактора и добавьте следующую строку

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

отредактируйте файл, /etc/bluetooth/main.confиспользуя предпочитаемый текстовый редактор (я использую nano).

Установите Bluetooth Class, измените следующую строку на:

 Class = 0x00041C

0x000041C означает, что Rpi Bluetooth поддерживает протокол A2DP.

изменить /etc/pulse/daemon.conf добавить / изменить (не забудьте тщательно проверить код перед их добавлением) и изменить

resample-method = trivial

Вы можете использовать любой метод, который вам нравится, я лично speex-float-3для справки вы можете увидеть эту ссылку

Запустите Pulseaudio службы с:

pulseaudio -D

мы собираемся использовать скрипт ragusa87 для автоматизации источника bluetooth для передачи звука. Сначала добавьте новую конфигурацию в udev init.d, отредактировав файл /etc/udev/rules.d/99-input.rulesи добавив его в файл.

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

добавить папку udevв /usr/libпомощью MKDIR

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

и добавить это в файл блютус (кредиты 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

ОБРАТИТЕ ВНИМАНИЕ, что ваш AUDIOSINK может отличаться от моего, проверьте его перед использованием pactl list short sinks

сделать скрипт исполняемым, введя этот код

chmod 777 bluetooth 

подключите гарнитуру, чтобы проверить работоспособность аудиоразъема и

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

или вы можете установить аудио маршрутизацию по умолчанию с

sudo amixer cset numid = 3 n

где n может быть: 0 = авто 1 = джек 2 = HDMI

3. Соедините и подключите аудио

перейдите к терминалу и введите bluetoothctl. Сначала активируйте Bluetooth с помощью, power onа затем agent onустановите агент по умолчанию, с которым вы редактировали ранее default-agent, а затем включите режим обнаружения и режим сопряжения с помощью discoverable on; pairable on. Вы должны увидеть raspberrypi bluetooth на своем телефоне или ноутбуке, и вы можете подключить его к телефону, щелкнув по нему и коснувшись пары. На терминале вы вводите y. Возвращаясь к терминалу, вы подключаетесь к телефону по типу, connect xx:xx:xx:xx:xx:xxгде xx:xx:xx:xx:xx:xx - ваш телефонный MAC-адрес Bluetooth. и не забудьте довериться тому, trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxявляется ли ваш телефон Bluetooth-адресом Mac. Вуаля, у вас есть Bluetooth-усилитель (или как его там) с помощью RasPberry.

4. Вывод

попробовав и поэкспериментировав, я обнаружил, что качество звука низкое, и я скорее не буду его использовать, так как малина будет зависать, если вы используете ее с потоковой передачей песни в малину. Я советую использовать проект спикера UPNP с помощью gmediarenderer. Звук превосходен, нет задержки и рассеивается звук, и он может воспроизводить аудиофайл без потерь (flac, wav, dll). Это подробно, как его настроить

ссылка: учебник JobPassion ; сценарий Рагузы ; сопутствующая работа ;

xdhe
источник
Я не могу выполнить sudo service pulseaudio restart, я получаюFailed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr
Более того, bluetoothctlкогда connect xx:xx:xx:xx:xx:xxя Failed to connect: org.bluez.Error.Failedиспользую мой телефон или ноутбук
gtatr
Что вы используете? Единственная операционная система, которая поддерживает Rasberry Pi 3 на борту Bluetooth, это Rasbian Jessie и Ubuntu Mate> 16.04. На Ubuntu Mate Bluetooth уже присутствует, a2dp, так что вы можете проверить это в Bluetooth Manager.
xdhe
Если вы уже пробовали какое-либо онлайн-руководство и все испортили, я думаю, что лучше переустановить и очистить конфигурацию пакетов. Я связался с пакетами Bluetooth, установив вручную пакет rpi-bluetooth, и Bluetooth не работает. Так что я перепрошил распби изображение, и оно работает просто отлично, хотя звук не приятный IMO.
xdhe
Я использую недавно установленную raspbian Jessie, и я следовал вашим инструкциям шаг за шагом, возможно, есть пропущенный шаг из недавно установленной ОС. Я мог бы попробовать Ubuntu Mate
gtatr
16

Вот альтернативное решение, которое не зависит от PulseAudio: https://github.com/lukasjapan/bt-speaker

Установить на raspbian с правами root:

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

Он запустит демон динамика Bluetooth, который автоматически принимает одного клиента для A2DP / AVRCP и передает аудиопоток напрямую в ALSA.

Lukas
источник
Напоминание о безопасности: я написал сценарий самостоятельно, чтобы заверить вас, что он безопасен, но, пожалуйста, проверьте его содержимое самостоятельно
Лукас
хороший! Я постараюсь проверить это в ближайшие дни
gtatr
1
Я пробовал ваше решение, и оно сработало, но звук зависал каждую секунду. почему это происходит?
wolfram77
Скорее всего, проблема с Wi-Fi: github.com/lukasjapan/bt-speaker/issues/4
Лукас
3

Я написал краткие инструкции для Raspberry Pi 3 в моем блоге . Большинство онлайн-инструкций для старых версий Debian / Xbian. Вот инструкции, которые я протестировал и работаю над Raspberry Pi 3 с Xbian.

  1. Начните с установки / обновления всех пакетов

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. Добавить пользователей в группы. Это очень важно. Если вы используете любой другой дистрибутив, замените «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
    
  3. Настройка 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
    

Служба Bluetooth / класс устройства 0x200420 означают, что устройство настроено на автомобильную аудиосистему. Смотрите эту ссылку, чтобы узнать больше о возможностях Bluetooth Class.

  1. Для сопряжения с устройством нам необходимо использовать инструмент «bluetoothctl».

    sudo bluetoothctl
    
  2. Установите для агента значение KeyboardOnly и установите его по умолчанию. Это нужно сделать только один раз. Внутри bluetoothctl выполните следующие команды:

    agent KeyboardOnly
    default-agent
    
  3. Включите Bluetooth на вашем телефоне / планшете и убедитесь, что его можно обнаружить. Выполните следующие команды внутри bluetoothctl:

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

    xx: xx: xx: .. является MAC-адресом вашего телефона / устройства. После запуска «сканирования вкл» подождите минуту, пока ваше устройство не отобразится вместе с MAC-адресом. После запуска «pair xx: xx: xx: ..» проверьте ваше устройство и примите входящее соединение. Сделайте то же самое на терминале, набрав yes.

  4. Теперь подключитесь к Raspberry Pi со своего телефона, и он должен подключиться как аудиоустройство. Весь звук, воспроизводимый через устройство, теперь должен выводиться через HDMI или аналоговый выход Raspberry Pi в зависимости от конфигурации вашего Pi.

  5. Если соединение не удается, попробуйте еще раз, иногда требуется 2 попытки.

Абдул Муид
источник
Спасибо, что нашли время ответить. Ответы, содержащие только ссылки, не приветствуются, так как невозможно сказать, что находится на другом конце - если связанная статья изменится или исчезнет, ​​этот ответ также изменится. Можете ли вы обобщить важные моменты?
goobering
@ Goobering: сообщение обновлено. Я не слишком знаком с форматированием на сайтах стека, но я сделал это в меру своих возможностей. Спасибо, что нашли время, чтобы рассмотреть мой ответ.
Хорошего
1
Что вы сделали, чтобы починить прерывистый звук?
NoBugs
Это супер изменчиво. Должны ли мы разгонять пи?
б-ак
1
Инструкции Абдула работают отлично, однако вывод звука через динамик BT очень прерывистый. Это не приемлемое качество звука в любом случае. Родной звук PI через Pulseaudio очень хреновый. Время для гораздо лучшего решения, чем Bluetooth.
Дон Аллен
0

Перед тем, как отправиться в путь по этому маршруту, рассматривали ли вы, как известно, низкое качество выходного аудиоразъема RPi 3,5 мм?

Звуковой выход Raspberry Pi

Это может быть причиной того, что вы не можете найти актуальный учебник.

Чтобы быть справедливым, другая причина может заключаться в том, что приличная пара динамиков не менее дорогая, чем приличный динамик Bluetooth. Я бы не пошел по этому пути, если только вы не собираетесь вкладывать средства в звуковую карту USB (не дорого, но ваша общая цена начинает расти сейчас). Или, может быть, вы планируете использовать выход HDMI? Это действительно очень хорошо.

Как насчет этого? Все компоненты должны быть легко доступны.

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

Это был мой первый проект RPi. Я не очень внимательно посмотрел, но я считаю, что компонент MPD можно использовать для потоковой передачи Bluetooth на RPi. Я оставлю вас, чтобы сделать это исследование.

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

KDM
источник
Я согласен с вами в том, что существуют более готовые решения, и не такие дорогие, но я хочу, чтобы это было частью более крупного проекта
gtatr
Я только размышляю о причинах для пожилых инструкций. Смотрите другие заметки о возможных решениях. Посмотрите на демона MPD. Я могу ошибаться, но я думаю, что это может течь Bt. Могли бы использовать чуть больше деталей. Если вы собираетесь использовать 3,5-мм аудиоразъем, он, вероятно, будет нормально работать на 75%, но вам придется полагаться на внешний усилитель для регулировки громкости.
KDM
Кстати, я попробовал этот урок, плюс почти любой другой урок онлайн, но безуспешно
gtatr