Налаштуйте Raspberry Pi 3 як динамік Bluetooth


36

Я шукаю спосіб налаштувати Raspberry Pi 3 як динамік Bluetooth за допомогою Raspbian Jessie. Що я маю на увазі під Bluetooth-динаміком, це використовувати його для отримання аудіо потоку через Bluetooth через A2DP та відтворення його через колонки, підключені до Raspberry Pi, через аудіороз'єм, порт HDMI або аудіо-адаптер USB.

В Інтернеті доступні різні підручники, але вони досить застарілі, і більшість з них більше не працює.


Незрозуміло, що ви маєте на увазі під «Bluetooth-оратором»
Milliways

1
Відредаговано. Надія ясна зараз
gtatr

Мені абсолютно зрозуміло, мені цікаво читати будь-які реальні відповіді.
Burt_Harris

Рішення, проголосоване, є аналогічним маршрутом, який я закінчив. Однак у мене є github repo, який встановить це для вас на свіжому встановленні Rasbian Jessie Lite (не впевнений, що він працює без маленького конфігурації для Jessie з пікселем), просто дотримуйтесь інструкцій із встановлення тут: github.com/bareinhard/… . Основна проблема, яку я бачу з існуючими рішеннями, полягає в тому, що вони за замовчуванням використовують pulseaudio5. Це дозволить скласти pa6 і позбутися від багатьох проблем із відтворенням, якими користується pa5.
Бретт Райнхард

Відповіді:


25

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

Це крок, над яким я працював, і він працює над малиновим пі 3.

1. Завантажте необхідний пакет

Цей проект залежить від pulseaudio, тому захопіть його та встановіть, ввівши:

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

Я скоріше оновіть прошивку малинових програм, перш ніж встановлювати їх, тому що у мене проблеми з rpi-bluetoothпакетом, так що я роблю:

sudo rpi-update

і зробіть його встановленням та перейдіть до наступного кроку.

2. Відредагуйте конфігурацію та застосуйте її

Спочатку додайте ім’я pi 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 = 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

і додайте це до файлу bluetooth (кредити 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 = auto 1 = гніздо 2 = hdmi

3. З'єднайте пару та підключіть аудіо

перейти до терміналу та набрати bluetoothctl. Спершу активізуйте Bluetooth через, power onа потім agent onвстановіть агент за замовчуванням, який ви редагували раніше default-agent, а потім увімкніть режим, який можна відкрити, і режим парування discoverable on; pairable on. Ви маєте бачити малиновий bluetooth на телефоні чи ноутбуці, і ви можете його з’єднати по телефону, натиснувши його та торкніться пари. На терміналі ви вводите y. Повернувшись до терміналу, ви підключаєтесь до телефону за типом, connect xx:xx:xx:xx:xx:xxде xx:xx:xx:xx:xx:xx - ваша телефонна мак-адреса Bluetooth. і не забудьте довіряти trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxце ваш телефон bluetooth mac адреса.

4. Висновок

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

довідка: навчальний посібник із завдання на роботу ; сценарій ragusa ; пов'язана робота ;


Я не в змозі стратити 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

Що ви використовуєте? Єдиний ОС, який підтримує малину pi 3 на борту Bluetooth, - це розпбій Джессі та Ubuntu Mate> 16.04. На Ubuntu Mate вже присутній bluetooth a2dp, тому ви можете перевірити це в Bluetooth Manager.
xdhe

Якщо ви вже пробували будь-який онлайн-підручник і зіпсували, я думаю, що найкраще перевстановити та очистити конфігурацію пакетів. Я возився з пакетами Bluetooth, встановивши вручну пакет rpi-bluetooth, і Bluetooth не працює. Тож я перепрошив розпорядження малюнка, і він працює чудово, хоча звук не приємний IMO.
xdhe

Я використовую щойно встановлений розп’ян Джессі, і я дотримувався ваших вказівок крок за кроком, можливо, є якийсь пропущений крок, що надходить із щойно встановленої ОС. Я можу спробувати 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.


Нагадування щодо безпеки: Я написав сценарій власноруч, тому можу запевнити, що він безпечний, але будь ласка, перевірте його вміст власноруч
Лукаш

приємно! Я спробую перевірити це в наступні дні
gtatr

1
Я пробував ваше рішення, і це спрацювало, але аудіо застрягло кожну другу секунду. чому це відбувається?
wolfram77

Швидше за все, питання Wi-Fi: github.com/lukasjapan/bt-speaker/isissue/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.

  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-адресою. Після запуску "пари xx: xx: xx: .." перевірте свій пристрій і прийміть вхідне з'єднання. Зробіть те ж саме на терміналі, набравши так.

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

  5. Якщо з'єднання не вдалося, спробуйте ще раз, іноді це потребує 2 спроб.


Дякуємо, що знайшли час для відповіді. Відповіді, що стосуються лише посилань, не відмовляються, оскільки там немає жодного повідомлення про те, що знаходиться на іншому кінці - якщо пов'язана стаття змінюється або зникає, то це відповідає і на цю відповідь. Чи можете ви підсумувати важливі моменти?
goobering

@goobering: повідомлення оновлено. Я не надто знайомий з форматуванням на сайтах Stack, але я це зробив якнайкраще. Дякую, що знайшли час, щоб переглянути мою відповідь. Приємного дня
Абдул Мюїд

1
Що ви зробили, щоб виправити похмурий звук?
NoBugs

Це супер хитро. Чи треба розігнати пі?
б-ак

1
Інструкції Абдула прекрасно працюють, однак аудіозапис через динамік BT дуже спритний. У будь-якому випадку це неприйнятна якість звуку. PI рідне аудіо через Pulseaudio дуже хитро. Час для набагато кращого рішення, ніж Bluetooth.
Дон Аллен

0

Перед тим, як відправлятися вниз по цьому маршруту, ви вважали горезвісно низькою якістю 3,5-міліметрового аудіороз'єму RPi?

Звуковий вихід 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


Я погоджуюсь з вами з приводу того, що там є кращі готові рішення, і це не так дорого, але я хочу, щоб це було частиною більшого проекту
gtatr

Я лише міркую над причинами інструкцій для літніх людей. Дивіться й інші примітки щодо потенційних рішень. Подивіться на демон MPD. Я можу помилятися, але я думаю, що це може передавати Bt. Можна використати трохи детальніше. Якщо ви збираєтеся використовувати 3,5-мм аудіороз'єм, він, ймовірно, спрацює на 75%, але для регулювання гучності вам потрібно буде покластися на зовнішній підсилювач.
KDM

btw Я спробував цей підручник, а також майже будь-який інший підручник в Інтернеті, але без успіху
gtatr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.