ฉันได้รับในโครงการนี้หลังจากนั้นในขณะที่ (เพื่อช่วยเพื่อนของฉันทำกระดาษของพวกเขาสำหรับการจบการศึกษา) และค้นหาโครงการออนไลน์ที่ทำได้ดี (แม้ว่าการประมวลผล pi เสียงค่อนข้างล้าหลัง pi และแรงดันตกทำให้มันแข็งเป็นวิธีเดียว เพื่อให้รีบูตเครื่องคือถอดปลั๊กสายไฟ)
นี่เป็นขั้นตอนที่ฉันได้ทำไปแล้วและใช้งานได้กับ 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
ฉันค่อนข้างอัปเดตเฟิร์มแวร์ของราสเบอร์รี่ก่อนที่จะติดตั้งเพราะฉันมีปัญหากับ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
โดยใช้โปรแกรมแก้ไขข้อความที่คุณต้องการ (ฉันใช้นาโน)
ตั้งค่าคลาส Bluetooth, แก้ไขบรรทัดต่อไปนี้เป็น:
Class = 0x00041C
0x000041C
หมายความว่า rpi bluetooth รองรับโปรโตคอล A2DP
เปลี่ยน/etc/pulse/daemon.conf
เพิ่ม / แก้ไข (อย่าลืมตรวจสอบรหัสอย่างละเอียดก่อนที่จะเพิ่ม) และเปลี่ยน
resample-method = trivial
คุณสามารถใช้วิธีการใด ๆ ที่คุณชอบฉันใช้speex-float-3
สำหรับการอ้างอิงคุณสามารถดูลิงค์นี้
เริ่มบริการ pulseaudio ด้วย:
pulseaudio -D
เราจะใช้สคริปต์ ragusa87 เพื่อทำให้แหล่งบลูทู ธ เป็นแหล่งเก็บเสียงโดยอัตโนมัติ ขั้นแรกโปรดเพิ่มการกำหนดค่าใหม่ลงใน 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
ไปยังสถานีและประเภท เปิดใช้งานบลูทู ธ เป็นครั้งแรกที่มีpower on
แล้วagent on
ตั้งตัวแทนเริ่มต้นที่คุณได้รับการแก้ไขก่อนด้วยและจากนั้นตั้งค่าโหมดการค้นพบและโหมดคู่กับdefault-agent
discoverable on; pairable on
คุณควรเห็นบลูทู ธ raspberrypi บนโทรศัพท์หรือแล็ปท็อปของคุณและคุณสามารถจับคู่กับมันทางโทรศัพท์โดยคลิกที่มันแล้วแตะที่จับคู่ บนเทอร์มินัลคุณพิมพ์ y กลับไปที่เทอร์มินัลคุณเชื่อมต่อกับโทรศัพท์ตามประเภทโดยconnect xx:xx:xx:xx:xx:xx
ที่xx:xx:xx:xx:xx:x
x คือที่อยู่บลูทู ธ โทรศัพท์ mac ของคุณ และอย่าลืมที่จะไว้วางใจด้วยtrust xx:xx:xx:xx:xx:xx
where xx:xx:xx:xx:xx:xx
คือที่อยู่บลูทู ธ ของคุณและ voila คุณมีเครื่องขยายเสียงบลูทู ธ (หรือชื่ออะไรก็ตาม) โดยใช้ราสเบอร์รี่
4. สรุป
หลังจากลองและทดลองฉันพบว่าคุณภาพเสียงต่ำและฉันไม่ได้ใช้เพราะราสเบอร์รี่จะหยุดถ้าคุณใช้กับเพลงที่กำลังสตรีมไปยังราสเบอร์รี่ ฉันแนะนำให้ใช้โครงการลำโพง UPNP โดยใช้ gmediarenderer เสียงที่ยอดเยี่ยมและไม่มีความล่าช้าและกระจายเสียงและสามารถเล่นไฟล์เสียง lossless (flac, wav, dll) นี่คือรายละเอียดวิธีการตั้งค่า
การอ้างอิง:
บทช่วยสอนของ jobpassion ;
สคริปต์ Ragusa ของ ;
การทำงานที่เกี่ยวข้อง ;