Atur Raspberry Pi 3 sebagai speaker bluetooth

36

Saya mencari cara untuk mengkonfigurasi Raspberry Pi 3 sebagai speaker bluetooth menggunakan Raspbian Jessie. Yang saya maksud sebagai speaker bluetooth adalah menggunakannya untuk menerima aliran audio melalui bluetooth menggunakan A2DP dan memutarnya melalui speaker yang terhubung ke Raspberry Pi melalui jack audio, port HDMI atau adaptor audio USB.

Berbagai tutorial tersedia online tetapi cukup usang dan sebagian besar tidak berfungsi lagi.

gtatr
sumber
Tidak jelas apa yang Anda maksud dengan "sebagai speaker bluetooth"
Milliways
1
Diedit. Harapan sudah jelas sekarang
gtatr
Jelas bagi saya, saya tertarik membaca jawaban yang sebenarnya.
Burt_Harris
Solusi yang dipilih adalah rute serupa yang saya akhiri. Namun, saya memiliki repo github yang akan mengatur ini untuk Anda pada pemasangan baru raspbian Jessie Lite (tidak yakin apakah itu bekerja tanpa konfigurasi kecil untuk Jessie dengan piksel) cukup ikuti petunjuk pemasangan di sini: github.com/bareinhard/… . Masalah utama yang saya lihat dengan solusi yang ada adalah bahwa mereka menggunakan pulseaudio5 secara default. Ini akan mengkompilasi pa6 dan menyingkirkan banyak masalah pemutaran yang dialami pa5.
Brett Reinhard

Jawaban:

25

Saya telah berada di proyek ini setelah beberapa saat (untuk membantu teman saya mengerjakan makalah mereka untuk lulus) dan menemukan proyek online baik-baik saja (walaupun pi memproses audionya cukup tertinggal pi, dan penurunan tegangan membuatnya macet sebagai satu-satunya cara untuk membuatnya reboot berarti mencabut kabel daya).

Ini adalah langkah yang telah saya kerjakan dan ini bekerja pada raspberry pi 3.

1. Unduh paket yang diperlukan

Proyek ini bergantung pada pulseaudio, jadi ambil dan instal dengan mengetik:

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

saya lebih suka memperbarui firmware raspberry terlebih dahulu sebelum menginstalnya karena saya punya masalah dengan rpi-bluetoothpaket jadi saya lakukan:

sudo rpi-update

dan membuatnya menginstal dan maju ke langkah selanjutnya.

2. Edit Konfigurasi dan terapkan

Pertama tambahkan pi username ke grup pulseaudio dengan

sudo usermod -a -G lp pi

buat config baru di bawah /etc/bluetooth/audio.conf menggunakan editor teks dan tambahkan baris berikut

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

edit file /etc/bluetooth/main.confmenggunakan editor teks pilihan Anda (Saya menggunakan nano).

Setel Kelas Bluetooth, Ubah baris berikut ke:

 Class = 0x00041C

0x000041C berarti rpi bluetooth mendukung protokol A2DP.

ubah /etc/pulse/daemon.conf tambah / modifikasi (jangan lupa untuk memeriksa kode secara menyeluruh sebelum menambahkannya), dan ubah

resample-method = trivial

Anda dapat menggunakan metode apa pun yang Anda suka, saya pribadi menggunakan speex-float-3untuk referensi Anda dapat melihat tautan ini

mulai layanan pulseaudio dengan:

pulseaudio -D

kita akan menggunakan skrip ragusa87 untuk mengotomatisasi sumber bluetooth ke wastafel audio. Pertama tolong tambahkan konfigurasi baru ke udev init.d dengan mengedit file /etc/udev/rules.d/99-input.rulesdan menambahkan ini ke file

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

tambahkan folder udevke /usr/libdengan menggunakan mkdir

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

dan tambahkan ini ke file bluetooth (kredit 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

TOLONG Catat bahwa AUDIOSINK Anda mungkin berbeda dengan milik saya, periksa sebelum menggunakannya pactl list short sinks

buat skrip dapat dieksekusi dengan memasukkan kode ini

chmod 777 bluetooth 

pasang headset untuk menguji apakah jack audio berfungsi dan uji dengan

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

atau Anda dapat mengatur perutean audio default dengan

sudo amixer cset numid = 3 n

di mana n bisa menjadi: 0 = otomatis 1 = jack 2 = HDMI

3. Pasangkan dan Hubungkan audio

pergi ke terminal dan ketik bluetoothctl. Pertama-tama aktifkan bluetooth dengan power ondan agent on, setel agen default yang telah Anda edit sebelumnya default-agent, dan kemudian setel mode yang dapat ditemukan dan mode pasangan discoverable on; pairable on. Anda akan melihat raspberrypi bluetooth di ponsel atau laptop Anda dan Anda dapat memasangkannya di telepon dengan mengklik dan menyentuh pasangan. Di terminal Anda mengetik y. Kembali ke terminal, Anda terhubung ke telepon berdasarkan jenis x di connect xx:xx:xx:xx:xx:xxmana xx:xx:xx:xx:xx:xAnda adalah alamat mac bluetooth ponsel. dan jangan lupa percaya dengan trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxalamat mac bluetooth ponsel Anda. Dan voila Anda memiliki amplifier Bluetooth (atau apa pun namanya) dengan menggunakan raspberry.

4. Kesimpulan

setelah mencoba dan bereksperimen, saya menemukan kualitas audio rendah dan saya lebih suka tidak menggunakannya karena raspberry akan macet jika Anda menggunakannya dengan lagu yang sedang streaming ke raspberry. Saya menyarankan untuk menggunakan proyek speaker UPNP dengan menggunakan gmediarenderer. Audio yang luar biasa dan tidak ada penundaan dan menyebarkan suara dan dapat memutar file audio lossless (flac, wav, dll). Ini adalah detail cara mengaturnya

referensi: tutorial jobpassion ; naskah ragusa ; pekerjaan terkait ;

xdhe
sumber
Saya tidak dapat mengeksekusi sudo service pulseaudio restart, saya mendapatkanFailed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr
Apalagi dengan bluetoothctlketika saya melakukannya connect xx:xx:xx:xx:xx:xxsaya bisa Failed to connect: org.bluez.Error.Failedmenggunakan telepon atau laptop saya
gtatr
Os apa yang Anda gunakan? Satu-satunya os yang mendukung raspberry pi 3 onboard bluetooth adalah raspbian Jessie dan Ubuntu Mate> 16.04. Pada Ubuntu Mate, bluetooth a2dp sudah ada, jadi Anda mungkin memeriksanya di Bluetooth Manager.
xDi
Jika Anda sudah mencoba tutorial online dan mengacaukan, saya pikir yang terbaik adalah menginstal ulang dan membersihkan konfigurasi paket. Saya telah mengacaukan paket Bluetooth dengan menginstal paket 'rpi-bluetooth' secara manual dan Bluetooth tidak berfungsi. Jadi saya sudah reflash gambar raspbian dan berfungsi dengan baik meskipun suaranya tidak menyenangkan.
xd
Saya menggunakan Jessie raspbian yang baru diinstal, dan saya mengikuti instruksi Anda langkah demi langkah, mungkin ada langkah yang hilang dari OS yang baru diinstal. Saya mungkin mencoba Ubuntu Mate
gtatr
16

Berikut ini adalah solusi alternatif yang tidak bergantung pada PulseAudio: https://github.com/lukasjapan/bt-speaker

Instal di raspbian sebagai root dengan:

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

Ini akan memulai daemon speaker bluetooth yang secara otomatis menerima satu klien untuk A2DP / AVRCP dan menyalurkan aliran audio langsung ke ALSA.

Lukas
sumber
Pengingat keamanan: Saya menulis skrip sendiri sehingga saya dapat meyakinkan Anda bahwa itu aman tetapi tolong verifikasi kontennya sendiri
Lukas
bagus! Saya akan mencoba untuk menguji ini di hari
gtatr
1
saya sedang mencoba solusi Anda, dan itu berhasil tetapi audio macet setiap detik. mengapa ini terjadi?
wolfram77
Kemungkinan besar masalah Wifi: github.com/lukasjapan/bt-speaker/issues/4
Lukas
3

Saya telah menulis instruksi singkat untuk Raspberry Pi 3 di blog saya . Sebagian besar instruksi online adalah untuk versi Debian / Xbian yang lebih lama. Berikut adalah instruksi yang telah saya uji dan sedang mengerjakan Raspberry Pi 3 dengan Xbian.

  1. Mulailah dengan menginstal / memperbarui semua paket

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. Tambahkan pengguna ke grup. Ini sangat penting. Jika menggunakan distro lain, ganti 'xbian' dengan nama pengguna Anda.

    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. Atur PulseAudio & Kelas Perangkat 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
    

Layanan Bluetooth / kelas perangkat 0x200420 berarti perangkat diatur untuk Audio Mobil. Lihat tautan ini untuk menjelajahi lebih banyak opsi Kelas Bluetooth.

  1. Untuk memasangkan dengan perangkat, kita perlu menggunakan alat "bluetoothctl".

    sudo bluetoothctl
    
  2. Setel agen ke KeyboardOnly dan jadikan default. Ini perlu dilakukan sekali saja. Di dalam bluetoothctl, jalankan perintah berikut:

    agent KeyboardOnly
    default-agent
    
  3. Nyalakan bluetooth di ponsel / tablet Anda dan pastikan itu dapat ditemukan. Jalankan perintah berikut di dalam bluetoothctl:

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

    xx: xx: xx: .. adalah alamat MAC dari ponsel / perangkat Anda. Setelah menjalankan 'pindai aktif', tunggu sebentar agar perangkat Anda muncul bersama alamat MAC-nya. Setelah menjalankan 'pair xx: xx: xx: ..' periksa perangkat Anda dan terima koneksi yang masuk. Lakukan hal yang sama pada terminal dengan mengetikkan yes.

  4. Sekarang sambungkan ke Raspberry Pi dari ponsel Anda dan itu harus terhubung sebagai perangkat audio. Semua audio yang diputar melalui perangkat sekarang harus menjadi output menggunakan Raspberry Pi HDMI atau Analog out tergantung pada konfigurasi Pi Anda.

  5. Jika koneksi gagal, coba lagi, kadang-kadang dibutuhkan 2 upaya.

Abdul Mueid
sumber
Terima kasih telah meluangkan waktu untuk menjawab. Jawaban hanya tautan tidak disarankan karena tidak ada yang tahu apa yang ada di ujung sana - jika artikel yang ditautkan berubah atau menghilang, begitu juga jawaban ini. Bisakah Anda merangkum poin-poin penting?
goobering
@goobering: Posting diperbarui. Saya tidak terlalu terbiasa dengan pemformatan di situs Stack tetapi saya telah melakukannya dengan kemampuan terbaik saya. Terima kasih telah meluangkan waktu untuk meninjau jawaban saya. Semoga hari Anda menyenangkan
Abdul Mueid
1
Apa yang Anda lakukan untuk memperbaiki audio choppy?
NoBugs
Ini sangat berombak. Apakah kita harus meng-overclock pi?
b-ak
1
Instruksi Abdul bekerja dengan sempurna, namun output audio melalui speaker BT sangat berombak. Bagaimanapun, ini bukan kualitas audio yang dapat diterima. Audio asli PI melalui Pulseaudio sangat jelek. Saatnya solusi yang jauh lebih baik daripada Bluetooth.
Don Allen
0

Sebelum Anda memulai dari rute itu, apakah Anda sudah mempertimbangkan kualitas buruk dari output jack audio RPi 3.5mm?

Output suara dari Raspberry Pi

Ini mungkin mengapa Anda tidak dapat menemukan tutorial terbaru.

Agar adil, alasan lain mungkin karena sepasang speaker yang layak tidak lebih murah daripada speaker Bluetooth yang layak. Saya tidak akan turun rute ini, kecuali niat Anda adalah juga berinvestasi dalam kartu suara USB (tidak mahal, tetapi total harga Anda mulai meningkat sekarang). Atau, mungkin Anda berencana menggunakan output HDMI? Sangat bagus.

Bagaimana dengan yang ini? Semua komponen harus tersedia.

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

Ini adalah proyek RPi pertama saya. Saya belum melihat dengan teliti, tapi saya percaya komponen MPD dapat digunakan untuk melakukan streaming Bluetooth ke RPi. Saya akan meninggalkan Anda untuk melakukan penelitian itu.

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

KDM
sumber
Saya setuju dengan Anda pada kenyataan bahwa ada solusi yang lebih siap di luar sana, dan tidak begitu mahal, tapi saya ingin ini menjadi bagian dari proyek yang lebih besar
gtatr
Saya hanya berspekulasi tentang alasan instruksi lanjut usia. Namun, lihat catatan lain tentang solusi potensial. Lihatlah daemon MPD. Saya mungkin salah, tapi saya pikir itu bisa streaming Bt. Bisa menggunakan sedikit lebih detail. Jika Anda akan menggunakan jack audio 3.5mm, itu mungkin akan bekerja dengan baik pada 75%, tetapi Anda harus bergantung pada amplifier eksternal untuk kontrol volume.
KDM
btw saya mencoba tutorial itu, plus hampir semua tutorial online lainnya tetapi tidak berhasil
gtatr