พื้นหลัง
มันวิเศษมากที่ได้เห็นว่ามีความพยายามมากแค่ไหนในการพยายามแก้ไขปัญหาเกี่ยวกับเสียงต่างๆสำหรับ Raspberry Pi เห็นได้ชัดว่ามันจะต้องเป็นจุดอ่อนที่สุดสำหรับผู้ใช้ใหม่ที่จะพัฒนาและใช้ ALSA ภายใต้ Raspbian ได้สำเร็จ หลังจากใช้เวลาและความพยายามอย่างมากเพื่อให้เสียง RPi3 ของฉันทำงานในระบบปฏิบัติการรุ่นต่าง ๆ และใน Linux ดิสทริบิวชันอื่น ๆ ด้วยฉันตัดสินใจที่จะเขียนหน้าสรุปโซลูชันไปสู่ อย่างน้อยสำหรับหัวข้อของการใช้การ์ดเสียงภายนอกบนล่าสุด
Raspbian ยืด
ระบบเสียง ALSA
ALSA มีวัตถุประสงค์เพื่อสนับสนุนอุปกรณ์ที่ใช้ * nix ประเภทใดก็ได้โดยไม่คำนึงถึงการกำหนดค่าฮาร์ดแวร์และคำนึงถึงอายุของฮาร์ดแวร์ จำเป็นต้องมีจุดเล็ก ๆ ในการพยายามที่จะได้รับรายละเอียด
ของการพัฒนา20 ปี เราใช้สิ่งสำคัญกับสถานการณ์ปัจจุบัน
อย่างไรก็ตามในเวลาไม่นานในประวัติศาสตร์มนุษย์ได้สร้างไดอะแกรมที่ไร้ประโยชน์และผิดปกติจำนวนมากเพื่อพยายามอธิบาย ALSA คนเดียวที่ให้ข้อมูลจากระยะไกลคือสองคนนี้:
รับข้อมูลระบบ
ขั้นตอนแรกคือการหาว่าเสียงมีอะไรทำงานและฮาร์ดแวร์ใดบ้างที่คุณมีอยู่ มีหลายวิธีที่จะค้นหาตัวตน แต่สำหรับคนทั่วไปรายละเอียดส่วนใหญ่นั้นไร้ความหมาย เราแสดงสิ่งที่สำคัญที่สุด
เราต้องการรู้อะไรเกี่ยวกับระบบ (เสียง) ของเรา
เราต้องการที่จะรู้ว่า:
- ชื่อและเวอร์ชั่นของฮาร์ดแวร์เสียงในตัว
- ชื่อและเวอร์ชั่นของฮาร์ดแวร์เสียงภายนอก
- เคอร์เนลไดรเวอร์ใด (โมดูล) ที่ใช้
- มีการโหลดไดรเวอร์ / โมดูลเคอร์เนลเสียงอื่น ๆ ที่เกี่ยวข้องกับเสียงอะไร
- มีการ์ดเสียงอะไรบ้าง
- ลำดับของการ์ดเสียงที่ใช้และเลือกโดยระบบปฏิบัติการและโปรแกรม
- หากมีโปรแกรมฮาร์ดแวร์หรือระบบเสียงที่ขัดแย้งกัน
คุณต้องการเล่นและบันทึกเสียงบนระบบของคุณจากที่ใด
ตัวเลือกของคุณสำหรับการเล่นเสียงสามารถ:
- จากช่องเสียบหูฟังเสียง 3.5 มม. ภายใน (เสียงอะนาล็อก)
- จากหน้าจอ / มอนิเตอร์ที่เชื่อมต่อ HDMI
- จากการ์ดเสียง USB ภายนอก
- จากพอร์ต GPIO
ตัวเลือกของคุณสำหรับการบันทึกเสียงสามารถ:
- จากการ์ดเสียง USB ภายนอก (ที่มีอินพุตอย่างน้อยหนึ่งประเภท)
- ข จากไฟล์หรือสตรีม
- ค. จาก GPIO
ในนี้โพสต์เราจะบอกวิธีการเล่นและบันทึกการใช้การ์ดเสียง USB ภายนอก
แผนความสำเร็จในอนาคตพิสูจน์?
ด้วยการอัปเดตของ RPi ทำให้มีการเปลี่ยนแปลงและปรับปรุงใหม่ ๆ อย่างต่อเนื่องซึ่งมักจะทำลายโซลูชันเก่า แนวคิดในที่นี้คือการเปลี่ยนแปลงระบบให้น้อยที่สุดเท่าที่จะทำได้หรือทำให้ชัดเจนหากจำเป็น ซึ่งหมายความว่าเราต้องการใช้การกำหนดค่าตามผู้ใช้มากกว่าระบบที่กว้าง เช่นพยายามใช้ไฟล์การกำหนดค่าในไดเรกทอรีบ้านของคุณแทนที่จะเป็นไฟล์ระบบที่เป็นเจ้าของรูท
TL; DR (เริ่มกันเถอะ!)
รีบูตและปลั๊กอินการ์ดเสียง USB ภายนอกของคุณดังนั้นเราจึงเริ่มต้นในหน้าเดียวกัน ...
A. รวบรวมข้อมูล
# Check ALSA modules
cat /proc/asound/modules
0 snd_bcm2835
1 snd_usb_audio
# Check sound hardware
cat /proc/asound/cards
0 [ALSA ]: bcm2835 - bcm2835 ALSA
bcm2835 ALSA
1 [Set ]: USB-Audio - C-Media USB Headphone Set
C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed
# Check info on card-1
amixer -c 1
Simple mixer control 'Headphone',0
Capabilities: pvolume pswitch pswitch-joined
Playback channels: Front Left - Front Right
Limits: Playback 0 - 151
Mono:
Front Left: Playback 104 [69%] [-8.88dB] [on]
Front Right: Playback 104 [69%] [-8.88dB] [on]
Simple mixer control 'Mic',0
Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined
Playback channels: Mono
Capture channels: Mono
Limits: Playback 0 - 32 Capture 0 - 16
Mono: Playback 23 [72%] [34.36dB] [off] Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
Capabilities: pswitch pswitch-joined
Playback channels: Mono
Mono: Playback [on]
ที่นี่เราเห็นว่าค่าเริ่มต้นของระบบ ( card 0
) กำลังใช้โมดูล bcm2835 ALSA แม้ว่าโดยปกติเราจะสามารถระบุการ์ดที่จะใช้ แต่ซอฟต์แวร์บางอย่างเช่นomxplayer
ไม่มีตัวเลือกนี้และจะไม่สร้างเสียงใด ๆ ในรูปแบบต่างๆ
ถึงตอนนี้คุณสามารถลองกำหนดค่าไฟล์ ALSA ได้แล้ว บางคนประสบความสำเร็จในขณะที่คนอื่น ๆ ไม่ได้เพราะไม่ชัดเจนว่าควรทำอย่างไรและที่ไหน สิ่งที่เราต้องการในที่สุดคือบอกให้ระบบของเราใช้การ์ดเสียง USB ภายนอกของเรา
B. ลบเสียงบวม
หากคุณไม่มีเหตุผลที่ดีในการเก็บPulseAudio (PA) หรือ
ซอฟต์แวร์เซิร์ฟเวอร์JACK เพิ่มเติม คุณควรถอนการติดตั้งหากมี พวกเขามักจะยุ่งเกี่ยวกับ ALSA เนื่องจากพวกเขาควบคุมฟังก์ชั่น ALSA จำนวนมากและการกำหนดค่าเพิ่มเติมทั้งหมดที่จำเป็นสำหรับผู้ใช้ทำให้สิ่งต่าง ๆ สับสนอย่างไม่น่าเชื่อ!
sudo apt-get remove pulseaudio
# You can keep `jack*`, but make sure it is not running.
# If it is running you need to stop it, disble it or remove it.
service --status-all
# Disable the running service with:
sudo systemctl disable xxxxx
C. ปิดการใช้งานการ์ดเสียงภายใน (Broadcom)
การ์ดเสียงภายในขับเคลื่อนโดยโมดูลเคอร์เนลใน:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
หากคุณไม่ได้วางแผนที่จะใช้แจ็คเสียง (ใน 1) หรือ HDMI (ใน 2) คุณควรปิดการใช้งานโมดูลเคอร์เนลนี้ มีสองวิธีในการทำเช่นนี้
- ปิดใช้งานด้วยการตั้งค่าสถานะการบูต
- ป้องกันมิให้โหลดลงในเคอร์เนลโดย
modprobe.d
daemon
พยายามอยู่กับแนวทางแบบเรียบง่ายเราเลือก (1)
# Edit boot config with:
sudo nano /boot/config.txt
# so that:
cat /boot/config.txt
...
# Enable audio (loads snd_bcm2835)
#dtparam=audio=on
dtparam=audio=off
...
# You need to reboot!
sudo reboot now
หากด้วยเหตุผลบางอย่างคุณต้องการใช้วิธีการ (2) จากนั้นคุณต้องบัญชีดำโมดูลเคอร์เนล การทำเช่นนี้คุณเพียงแค่ใส่คำblacklist
ตามด้วยชื่อของโมดูลในไฟล์ภายใต้*.conf
/etc/modprobe.d/
อย่างไรก็ตามมีไฟล์ที่ว่างและสำรองไว้แล้วซึ่งถูกเรียกraspi-blacklist.conf
ใช้เพื่อจุดประสงค์นี้ อย่างไรก็ตามหลังจาก 6 เดือนคุณจะลืมเรื่องนี้และสิ่งที่อยู่ในนั้นดังนั้นคุณควรตั้งชื่อให้ดีขึ้นหลังจากโมดูลที่คุณกำลังขึ้นบัญชีดำ
cd /etc/modprobe.d/
# Manually edit a new file: blacklist-snd_bcm2835.conf
#sudo nano blacklist-snd_bcm2835.conf
# And add the line: blacklist snd_bcm2835
## OR directly with:
sudo tee /etc/modprobe.d/blacklist-snd_bcm2835.conf <<EOF
blacklist snd_bcm2835
EOF
# You need to reboot!
sudo reboot now
ความแตกต่างคืออะไร? ไม่มี AFAICT
หลังจากรีบูตให้ตรวจสอบโมดูลเสียงของคุณอีกครั้ง
$ cat /proc/asound/modules
1 snd_usb_audio
$ cat /proc/asound/cards
1 [Set ]: USB-Audio - C-Media USB Headphone Set
C-Media USB Headphone Set at usb-3f980000.usb-1.5, full speed
บอม! bcm2835 ที่น่ารำคาญของคุณcard 0
หายไปแล้ว แต่ดัชนีของการ์ด USB เหมือนกัน! นี่เป็นสิ่งที่ดีจริงๆ
กำหนดค่า ALSA ของคุณ
ตามที่ฉันได้กล่าวไปแล้วเราต้องการให้ ALSA ใช้การ์ดเสียง USB ของเราเป็นค่าเริ่มต้น นี่ก็หมายความว่าเราต้องการให้มีดัชนีแรกที่มีอยู่ในรายการของโมดูลเสียงเคอร์เนล เนื่องจากโมดูลถูกลบด้านบนและดัชนีเหมือนกัน (การ์ด 1) เราก็ดี แต่ในกรณีที่เราต้อง bcm2835 โหลดอีกครั้งเราไม่ได้เป็นที่โมดูลจะปรากฏขึ้นอีกครั้งเป็นครั้งแรก ( card 0
)
เราเพียงแค่ต้องบอก ALSA ว่าดัชนีบัตร PCM เริ่มต้นของเราควรเป็นอย่างไร
และในลำดับใดที่ควรจัดลำดับความสำคัญในเคอร์เนล
มี 3 ที่ที่คุณสามารถกำหนดค่า ALSA ของคุณได้
- config ของผู้ใช้ใน:
~/.asoundrc
- กำหนดค่าระบบใน:
/usr/share/alsa/alsa.conf
- conf โมดูลระบบใน:
/lib/modprobe.d/aliases.conf
2 ตัวแรกเปลี่ยนอุปกรณ์เริ่มต้นในขณะที่ตัวสุดท้ายให้ความมั่นใจในลำดับของการปรากฏตัว
เราแก้ไขการตั้งค่าเฉพาะของผู้ใช้card 1
ก่อน หากคุณมีการ์ดแสดงมากกว่าหนึ่งใบให้เลือกดัชนีของการ์ดที่คุณต้องการให้เป็นค่าเริ่มต้น
#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
EOF
ต่อไปเราจะแก้ไขการกำหนดค่าระบบโดยใช้หมายเลขดัชนีบัตรเดียวกันข้างต้น เราต้องทำเช่นนี้เพราะแพ็คเกจระบบบางอย่างจะไม่เห็นไฟล์กำหนดค่าผู้ใช้ของคุณ
sudo nano /usr/share/alsa/alsa.conf
# then replace:
#defaults.ctl.card 0
#defaults.pcm.card 0
# with:
defaults.ctl.card 1
defaults.pcm.card 1
ตอนนี้รีบูตเพื่อให้การเปลี่ยนแปลงมีผล
ตอนนี้คุณควรมีระบบเสียงที่ใช้งานได้
มาทดสอบกัน!
ในการทำการทดสอบที่เหมาะสมคุณต้องมีไฟล์ที่เหมาะสมในการทดสอบ ดังนั้นก่อนอื่นให้ตรวจสอบให้แน่ใจว่าไฟล์เสียงและวิดีโอทั้งหมดของคุณใช้งานได้จริง
(ฉันใช้เวลานานมากในการลองทดสอบวิดีโอ h264 / mp4 เพื่อเล่นเสียงเพื่อค้นพบในภายหลังเท่านั้นว่ามันไม่เคยเข้ารหัสเสียงเลย! Duh!)
คำเตือนหากคุณพยายามทดสอบวิดีโอที่ใช้MPEG-2
หรือVC-1
ตัวแปลงสัญญาณคุณต้อง
ซื้อ (!) รหัสตัวแปลงสัญญาณ
จากองค์กร RPi เพื่อให้สามารถถอดรหัสได้อย่างสมบูรณ์ด้วยตัวถอดรหัสฮาร์ดแวร์ในตัว มิฉะนั้นคุณจะต้องแปลงไฟล์ก่อน
คุณสามารถตรวจสอบว่าตัวแปลงสัญญาณของคุณเปิดใช้งานด้วย:
# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1
คุณจะต้องมีไฟล์ที่ได้รับการตรวจสอบเพื่อทำการทดสอบ คุณสามารถดาวน์โหลดและใช้สิ่งเหล่านี้ได้หากคุณไม่มี
# get some demo sound and video files
cd ~/Music
wget -Lk http://rpf.io/lamp3 -O example_11k.mp3
wget -Lk http://www.kozco.com/tech/piano2-CoolEdit.mp3 -O pianoTest_48k.mp3
wget -Lk http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_2mb.mp4 -O bbb_720p_2mb.mp4
wget -Lk https://raw.githubusercontent.com/mediaelement/mediaelement-files/master/big_buck_bunny.mp4 -O bbb_360_22k.mp4
ต่อไปมาเล่นกันเถอะ !!
# Double-check!
aplay -l && arecord -l
**** List of PLAYBACK Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
**** List of CAPTURE Hardware Devices ****
card 1: Set [C-Media USB Headphone Set], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
# Play white noise on 2-channels (L/R) on Card-1
speaker-test -c2 -D hw:1,0
# Play a WAV sound file
speaker-test -c2 -D hw:1,0 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav
# Once the correct default card+device is set, and after reboot,
# then full left/right voice test (above) is performed, just by:
speaker-test -c2 -twav
# Record some sounds (with a VU bar):
arecord --device=hw:1,0 --format S16_LE --rate 44100 -c1 -V mono test.wav
# Play recorded sounds
aplay -D plughw:1,0 test.wav
# Play recorded sounds (sample rate have to be equal)
speaker-test -c2 -D plughw:1,0 -r 44100 --test=wav -W $HOME -w test.wav
# Install an MP3 player
sudo apt-get install mpg123
# Play some MP3 file
mpg123 -v -r 44100 some.mp3
# Play an MP3 sound stream
mpg123 http://ice1.somafm.com/u80s-128-mp3
# This plays video, but no sound!
omxplayer -o alsa /opt/vc/src/hello_pi/hello_video/test.h264
# This plays video and sound!
omxplayer -o alsa bbb_720p_2mb.mp4
# The following plays sometimes (!?) and at the wrong speed!
omxplayer -o alsa some.mp3
คุณพร้อมที่จะไป!
[ไม่บังคับ] ลำดับของฮาร์ดแวร์เสียงเพิ่มเติม
หมายเหตุ หากคุณใช้ส่วนนี้คุณจะต้องเปลี่ยนค่าดัชนีบัตรทั้งหมดในส่วนด้านบน!
หากคุณแนบฮาร์ดแวร์เครื่องเสียงเพิ่มเติมและไม่ปรากฏขึ้นตามที่คุณต้องการคุณสามารถบังคับให้จัดเรียงลำดับการแสดงโมดูลใหม่ใน/lib/modprobe.d/aliases.conf
ไฟล์
โซลูชันบางตัวเสนอให้ทำการเปลี่ยนแปลงในไฟล์นี้ น่าเสียดายที่พวกเขาไม่ทราบว่าโมดูลเสียง USB เริ่มต้นของ RPi นั้นสะกดผิด! ดังนั้นการเปลี่ยนแปลงจะไม่มีผล โมดูลเสียงเคอร์เนลที่เรามีความกังวลกับจะเรียกว่าไม่snd_usb_audio
snd-usb-audio
ชื่อไฟล์ที่ถูกและตั้งอยู่ใน:snd-usb-audio.ko
/lib/modules/4.9.59-v7+/kernel/sound/usb/
ตลกพอข้อความในไฟล์บอกว่าไม่จำเป็นต้องแก้ไข!
sudo nano /lib/modprobe.d/aliases.conf
#--------------------------------------
# For original (out-of-box) use
#--------------------------------------
# replace this:
options snd-usb-audio index=-2
# with this:
options snd_usb_audio index=-2
#--------------------------------------
# To change the index & order
#--------------------------------------
# Set the index value of the cards:
options snd_usb_audio index=0
options snd_bcm2835 index=1
# Set the order:
options snd slots=snd_usb_audio,snd_bcm2835
อ้างอิง:
aplay
ไม่ได้ทำอะไรหลังจากทำงานนี้มาตลอดจนกระทั่งฉันใช้-D plughw:0,0
แทน-D hw:0,0
(ตาม shttps: //raspberrypi.stackexchange.com/a/89162) น่าเสียดายที่ในขณะนี้เกือบทุกอย่างสามารถเล่นเสียงผ่าน USB ได้ยูทิลิตี้ที่ฉันต้องทำงานส่วนใหญ่ (vban_receptor
) ยังใช้งานไม่ได้ แต่ ณ จุดนี้มันแทบจะไม่ใช่ความผิดของการตั้งค่าอีกต่อไปแล้ว