Cài đặt Raspberry Pi 3 làm loa bluetooth


36

Tôi đang tìm cách cấu hình Raspberry Pi 3 làm loa bluetooth bằng Raspbian Jessie. Ý tôi là loa bluetooth là sử dụng nó để nhận luồng âm thanh qua bluetooth bằng A2DP và phát qua loa được kết nối với Raspberry Pi thông qua giắc âm thanh, cổng HDMI hoặc bộ chuyển đổi âm thanh USB.

Các hướng dẫn khác nhau có sẵn trực tuyến nhưng khá lỗi thời và hầu hết chúng không còn hoạt động nữa.


Không rõ ý của bạn là "loa bluetooth"
Milliways

1
Đã chỉnh sửa. Hy vọng đã rõ ràng ngay bây giờ
gtatr

Hoàn toàn rõ ràng với tôi, tôi thích đọc bất kỳ câu trả lời thực sự.
Burt_Harris

Giải pháp được bình chọn là một lộ trình tương tự tôi đã kết thúc. Tuy nhiên, tôi có một repo github đó sẽ thiết lập này lên cho bạn trên một tươi cài đặt của raspbian Jessie Lite (không chắc chắn nếu nó hoạt động mà không có một cấu hình nhỏ cho Jessie với pixel) chỉ cần làm theo các hướng dẫn cài đặt ở đây: github.com/bareinhard/... . Vấn đề chính tôi thấy với các giải pháp hiện có là họ sử dụng pulseaudio5 theo mặc định. Điều này sẽ biên dịch pa6 và loại bỏ rất nhiều vấn đề phát lại mà pa5 gặp phải.
Brett Reinhard

Câu trả lời:


25

Tôi đã tham gia dự án này sau một thời gian (để giúp bạn tôi làm bài tốt nghiệp) và thấy dự án trực tuyến hoạt động tốt (mặc dù pi xử lý âm thanh khá chậm pi, và sụt áp làm cho nó đóng băng như là cách duy nhất để làm cho nó khởi động lại là rút cáp nguồn).

Đây là bước mà tôi đã làm việc và nó hoạt động trên raspberry pi 3.

1. Tải về gói yêu cầu

Dự án này phụ thuộc vào pulseaudio vì vậy hãy lấy nó và cài đặt bằng cách gõ:

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

Tôi thay vì cập nhật firmware của mâm xôi trước khi cài đặt chúng vì tôi gặp vấn đề với rpi-bluetoothgói nên tôi làm:

sudo rpi-update

và làm cho nó cài đặt và tiến tới bước tiếp theo.

2. Chỉnh sửa cấu hình và áp dụng nó

Đầu tiên thêm tên người dùng pi vào nhóm pulseaudio với

sudo usermod -a -G lp pi

tạo cấu hình mới trong /etc/bluetooth/audio.conf bằng trình soạn thảo văn bản và thêm dòng sau

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

chỉnh sửa tệp /etc/bluetooth/main.confbằng trình soạn thảo văn bản ưa thích của bạn (Tôi đang sử dụng nano).

Đặt Lớp Bluetooth, Sửa đổi dòng sau thành:

 Class = 0x00041C

0x000041C có nghĩa là bluetooth rpi hỗ trợ giao thức A2DP.

thay đổi /etc/pulse/daemon.conf thêm / sửa đổi (đừng quên kiểm tra kỹ mã trước khi thêm chúng) và thay đổi

resample-method = trivial

bạn có thể sử dụng bất kỳ phương pháp nào bạn thích, cá nhân tôi sử dụng speex-float-3để tham khảo bạn có thể thấy liên kết này

bắt đầu dịch vụ pulseaudio với:

pulseaudio -D

chúng tôi sẽ sử dụng tập lệnh ragusa87 để tự động hóa nguồn bluetooth sang âm thanh chìm. Trước tiên, vui lòng thêm cấu hình mới vào udev init.d bằng cách chỉnh sửa tệp /etc/udev/rules.d/99-input.rulesvà thêm tệp này vào tệp

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

thêm thư mục udevvào /usr/libbằng cách sử dụng mkdir

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

và thêm phần này vào tập tin bluetooth (tín dụng 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

XIN LƯU Ý rằng AUDIOSINK của bạn có thể khác với tôi, hãy kiểm tra nó trước khi sử dụng pactl list short sinks

làm cho tập lệnh thực thi bằng cách nhập mã này

chmod 777 bluetooth 

cắm tai nghe để kiểm tra xem giắc âm thanh có hoạt động không và kiểm tra

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

hoặc bạn có thể đặt định tuyến âm thanh mặc định với

sudo amixer cset numid = 3 n

Trong đó n có thể là: 0 = auto 1 = jack 2 = hdmi

3. Ghép nối và kết nối âm thanh

đi đến thiết bị đầu cuối và loại bluetoothctl. Trước tiên, hãy kích hoạt bluetooth power onvà sau đó agent on, đặt tác nhân mặc định mà bạn đã chỉnh sửa trước default-agentđó và sau đó đặt chế độ có thể khám phá và chế độ ghép nối với discoverable on; pairable on. Bạn sẽ thấy bluetooth raspberrypi trên điện thoại hoặc máy tính xách tay của bạn và bạn có thể ghép nối nó trên điện thoại bằng cách nhấp vào nó và chạm vào cặp. Trên thiết bị đầu cuối bạn gõ y. Về nhà ga, bạn kết nối với điện thoại bằng cách loại connect xx:xx:xx:xx:xx:xxnơi xx:xx:xx:xx:xx:xx là bạn điện thoại địa chỉ bluetooth mac. và đừng quên tin tưởng vào trust xx:xx:xx:xx:xx:xx where xx:xx:xx:xx:xx:xxđịa chỉ bluetooth mac của điện thoại Và voila bạn có bộ khuếch đại bluetooth (hoặc bất kể tên đó là gì) bằng cách sử dụng mâm xôi.

4. Kết luận

Sau khi thử và thử nghiệm, tôi phát hiện ra chất lượng âm thanh thấp và tôi không sử dụng nó vì mâm xôi sẽ bị đóng băng nếu bạn sử dụng nó với bài hát đang phát trực tiếp đến mâm xôi. Tôi khuyên bạn nên sử dụng dự án loa UPNP bằng cách sử dụng gmediarenderer. Âm thanh là tuyệt vời và không có độ trễ và âm thanh phân tán và nó có thể phát tệp âm thanh lossless (flac, wav, dll). Đây là chi tiết làm thế nào để thiết lập nó

tài liệu tham khảo: hướng dẫn công việc ; kịch bản của ragusa ; công việc liên quan ;


Tôi không thể thực thi sudo service pulseaudio restart, tôi nhận đượcFailed to restart pulseaudio.service: Unit pulseaudio.service failed to load: No such file or directory.
gtatr

Hơn nữa, với bluetoothctlkhi tôi làm connect xx:xx:xx:xx:xx:xxtôi nhận được Failed to connect: org.bluez.Error.Failedbằng cách sử dụng điện thoại hoặc máy tính xách tay
gtatr

Bạn đang sử dụng os gì? Hệ điều hành duy nhất hỗ trợ raspberry pi 3 trên bluetooth là raspbian Jessie và Ubuntu Mate> 16.04. Trên Ubuntu Mate, bluetooth a2dp đã có sẵn, vì vậy bạn có thể kiểm tra nó trên Trình quản lý Bluetooth.
xdhe

Nếu bạn đã thử bất kỳ hướng dẫn trực tuyến nào và gây rối, tôi nghĩ tốt nhất nên cài đặt lại và xóa cấu hình của các gói. Tôi đã làm rối các gói Bluetooth bằng cách cài đặt gói 'rpi-bluetooth' thủ công và Bluetooth không hoạt động. Vì vậy, tôi đã phản chiếu hình ảnh raspbian và nó hoạt động tốt mặc dù âm thanh IMO không dễ chịu.
xdhe

Tôi đang sử dụng một Jessie raspbian mới cài đặt, và tôi đang làm theo hướng dẫn của bạn từng bước, có lẽ có một bước còn thiếu đến từ một hệ điều hành mới được cài đặt. Tôi có thể dùng thử Ubuntu Mate
gtatr

16

Đây là một giải pháp thay thế không phụ thuộc vào PulseAudio: https://github.com/lukasjapan/bt-speaker

Cài đặt trên raspbian với quyền root với:

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

Nó sẽ bắt đầu một trình nền loa bluetooth tự động chấp nhận một ứng dụng khách duy nhất cho A2DP / AVRCP và chuyển luồng âm thanh trực tiếp sang ALSA.


Nhắc nhở về bảo mật: Tôi đã tự viết kịch bản để tôi có thể đảm bảo với bạn rằng nó an toàn nhưng vui lòng tự xác minh nội dung
Lukas

tốt đẹp! Tôi sẽ thử kiểm tra điều này trong những ngày tiếp theo
gtatr

1
Tôi đã thử giải pháp của bạn, và nó đã hoạt động nhưng âm thanh bị kẹt mỗi giây. Tại sao chuyện này đang xảy ra?
wolfram77

Nhiều khả năng là sự cố Wifi: github.com/lukasjapan/bt-speaker/issues/4
Lukas

3

Tôi đã viết hướng dẫn cô đọng cho Raspberry Pi 3 trên blog của mình . Hầu hết các hướng dẫn trực tuyến là dành cho các phiên bản cũ hơn của Debian / Xbian. Dưới đây là các hướng dẫn mà tôi đã thử nghiệm và đang làm việc trên Raspberry Pi 3 với Xbian.

  1. Bắt đầu bằng cách cài đặt / cập nhật tất cả các gói

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install pulseaudio-module-bluetooth bluez-tools
    
  2. Thêm người dùng vào nhóm. Cái này rất quan trọng. Nếu sử dụng bất kỳ bản phân phối nào khác, hãy thay thế 'xbian' bằng tên người dùng của bạn.

    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. Thiết lập lớp thiết bị 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
    

Lớp dịch vụ / thiết bị Bluetooth 0x200420 có nghĩa là thiết bị được thiết lập cho Âm thanh trên xe hơi. Xem liên kết này để khám phá thêm các tùy chọn Lớp Bluetooth.

  1. Để ghép nối với một thiết bị, chúng ta sẽ cần sử dụng công cụ bluetooth bluetoothctl.

    sudo bluetoothctl
    
  2. Đặt tác nhân thành KeyboardOnly và đặt mặc định. Điều này cần phải được thực hiện một lần duy nhất. Bên trong bluetoothctl, chạy các lệnh sau:

    agent KeyboardOnly
    default-agent
    
  3. Bật bluetooth trên điện thoại / máy tính bảng của bạn và đảm bảo có thể phát hiện được. Chạy các lệnh sau trong bluetoothctl:

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

    xx: xx: xx: .. là địa chỉ MAC của thiết bị cầm tay / thiết bị của bạn. Sau khi chạy 'quét trên', hãy đợi một phút để thiết bị của bạn hiển thị cùng với địa chỉ MAC. Sau khi chạy 'cặp xx: xx: xx: ..' hãy kiểm tra thiết bị của bạn và chấp nhận kết nối đến. Làm tương tự trên thiết bị đầu cuối bằng cách gõ có.

  4. Bây giờ kết nối với Raspberry Pi từ thiết bị cầm tay của bạn và nó sẽ kết nối như một thiết bị âm thanh. Bây giờ tất cả âm thanh được phát qua thiết bị sẽ được phát ra bằng HDMI hoặc Analog của Raspberry Pi tùy thuộc vào cấu hình của Pi của bạn.

  5. Nếu kết nối không thành công, hãy thử lại, đôi khi phải mất 2 lần thử.


Cảm ơn đã dành thời gian trả lời. Các câu trả lời chỉ liên kết không được khuyến khích vì không nói gì ở đầu kia - nếu bài viết được liên kết thay đổi hoặc biến mất, thì câu trả lời này cũng vậy. Bạn có thể tóm tắt những điểm quan trọng?
goobering

@goobering: Đăng cập nhật. Tôi không quá quen thuộc với định dạng trên các trang web Stack nhưng tôi đã làm nó hết khả năng của mình. Cảm ơn bạn đã dành thời gian để xem xét câu trả lời của tôi. Chúc một ngày tốt lành
Abdul Mueid

1
Bạn đã làm gì để khắc phục âm thanh bị vỡ?
NoBugs

Đó là siêu choppy. Chúng ta có phải ép xung pi không?
b-ak

1
Hướng dẫn của Abdul hoạt động hoàn hảo, tuy nhiên đầu ra âm thanh qua loa BT rất chói tai. Đây không phải là chất lượng âm thanh chấp nhận được trong mọi trường hợp. Âm thanh bản địa PI thông qua Pulseaudio rất nhảm nhí. Thời gian cho một giải pháp tốt hơn nhiều so với Bluetooth.
Don Allen

0

Trước khi bạn khởi chạy xuống tuyến đường đó, bạn đã xem xét chất lượng kém nổi tiếng của đầu ra jack âm thanh RPi 3,5 mm chưa?

Đầu ra âm thanh của Raspberry Pi

Đây có thể là lý do tại sao bạn không thể tìm thấy một hướng dẫn cập nhật.

Công bằng mà nói, lý do khác có thể là một cặp loa tốt không kém hơn một loa Bluetooth tốt. Tôi sẽ không đi theo con đường này, trừ khi bạn có ý định đầu tư vào soundcard USB (không đắt, nhưng tổng giá của bạn đang bắt đầu tăng ngay bây giờ). Hoặc, có thể bạn dự định sử dụng đầu ra HDMI? Nó thực sự rất tốt.

Cái này thì sao? Tất cả các thành phần nên có sẵn.

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

Đây là dự án RPi đầu tiên của tôi. Tôi đã không xem xét kỹ lưỡng, nhưng tôi tin rằng thành phần MPD có thể được sử dụng để truyền phát Bluetooth đến RPi. Tôi sẽ để bạn làm nghiên cứu đó.

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


Tôi đồng ý với bạn về thực tế là có những giải pháp sẵn sàng tốt hơn ngoài kia, và không quá đắt, nhưng tôi muốn đây là một phần của một dự án lớn hơn
gtatr

Tôi chỉ suy đoán về lý do cho các hướng dẫn người cao tuổi. Xem các ghi chú khác, mặc dù, về các giải pháp tiềm năng. Nhìn vào daemon MPD. Tôi có thể nhầm, nhưng tôi nghĩ nó có thể truyền phát Bt. Có thể sử dụng một chút chi tiết. Nếu bạn sẽ sử dụng giắc âm thanh 3,5mm, nó có thể sẽ hoạt động tốt ở mức 75%, nhưng bạn sẽ cần phải dựa vào bộ khuếch đại bên ngoài để điều khiển âm lượng.
KDM

btw Tôi đã thử hướng dẫn đó, cộng với hầu hết các hướng dẫn trực tuyến khác nhưng không thành công
gtatr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.