Lý lịch
Thật đáng kinh ngạc khi thấy có bao nhiêu nỗ lực đã cố gắng để giải quyết các vấn đề liên quan đến âm thanh khác nhau cho Raspberry Pi. Rõ ràng nó phải là điểm yếu nhất để người dùng mới phát triển thành công và sử dụng ALSA theo Raspbian. Đã dành thời gian và nỗ lực đáng kể để cố gắng để âm thanh RPi3 của riêng tôi hoạt động trong các phiên bản HĐH khác nhau và trong các bản phân phối Linux khác, tôi đã quyết định viết trang giải pháp kết luận. Ít nhất là đối với chủ đề sử dụng card âm thanh ngoài trên Raspbian Stretch mới nhất
.
Hệ thống âm thanh ALSA
ALSA có nghĩa là hỗ trợ bất kỳ loại thiết bị dựa trên * nix nào, bất kể cấu hình phần cứng của nó và bất kể phần cứng bao nhiêu tuổi. Không cần thiết, có rất ít điểm trong việc cố gắng đi vào chi tiết của
20 năm
phát triển của nó. Chúng tôi chỉ đơn giản là áp dụng bản chất cho một tình huống hiện tại.
Tuy nhiên, không có lúc nào trong lịch sử nhân loại tạo ra một số sơ đồ vô dụng và rối loạn như vậy, như để cố gắng giải thích ALSA. Những người duy nhất có thông tin từ xa là hai:
Lấy thông tin hệ thống
Bước đầu tiên là tìm ra âm thanh nào, nếu có, hoạt động và phần cứng nào bạn đã có. Có tất cả các cách để tìm ra những kẻ phá hoại, nhưng đối với người bình thường, hầu hết những chi tiết đó là vô nghĩa. Chúng tôi cho thấy quan trọng nhất.
Chúng ta muốn biết gì về hệ thống (âm thanh) của chúng ta?
Chúng tôi muốn biết:
- tên và phiên bản phần cứng âm thanh tích hợp
- tên và phiên bản phần cứng âm thanh bên ngoài
- trình điều khiển kernel (mô-đun) nào nó sử dụng
- những gì trình điều khiển / mô-đun hạt nhân liên quan đến âm thanh khác được tải
- những card âm thanh nào có sẵn
- Các card âm thanh được sử dụng và lựa chọn theo thứ tự nào
- nếu có bất kỳ chương trình phần cứng hoặc hệ thống âm thanh xung đột
Bạn muốn chơi và ghi lại âm thanh từ đâu trên hệ thống của mình?
Lựa chọn của bạn cho chơi âm thanh, có thể là:
- Từ giắc cắm tai nghe âm thanh 3,5 mm bên trong (âm thanh analog)
- Từ màn hình / màn hình được kết nối HDMI
- Từ một card âm thanh USB bên ngoài
- Từ cổng GPIO
Tùy chọn của bạn để ghi lại âm thanh, có thể là:
- a. Từ một card âm thanh USB bên ngoài (có ít nhất một loại đầu vào)
- b. Từ một tập tin hoặc luồng
- c. Từ một GPIO
Trong bài đăng này , chúng tôi sẽ cho bạn biết cách phát và ghi bằng thẻ âm thanh USB bên ngoài .
Một kế hoạch thành công trong tương lai?
Với các bản cập nhật của RPi, liên tục có những thay đổi và cải tiến mới, thường phá vỡ các giải pháp cũ. Ý tưởng ở đây là tạo ra càng ít thay đổi cho hệ thống càng tốt hoặc làm cho chúng rõ ràng nếu cần. Điều đó có nghĩa là, chúng tôi thích sử dụng cấu hình của người dùng hơn là hệ thống rộng. Tức là Cố gắng sử dụng các tệp cấu hình trong thư mục chính của bạn, thay vì trong các tệp hệ thống thuộc sở hữu gốc.
TL; DR (Hãy bắt đầu đi!)
Khởi động lại và cắm card âm thanh USB bên ngoài của bạn, vì vậy chúng tôi bắt đầu trên cùng một trang ...
A. Thu thập một số thông tin
# 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]
Ở đây chúng ta thấy rằng hệ thống mặc định ( card 0
) đang sử dụng mô-đun ALSA bcm2835. Mặc dù chúng ta thường có thể chỉ định sử dụng thẻ nào, một số phần mềm như omxplayer
không có tùy chọn này và sẽ không tạo ra bất kỳ âm thanh nào theo nhiều cách khác nhau.
Tại thời điểm này, bạn đã có thể cố gắng định cấu hình các tệp cấu hình ALSA của mình. Một số thành công, trong khi nhiều người khác thì không vì không rõ việc này nên được thực hiện như thế nào và ở đâu. Điều cuối cùng chúng tôi muốn là bảo hệ thống của chúng tôi sử dụng thẻ âm thanh USB bên ngoài.
B. Xóa âm thanh nở
Trừ khi bạn có những lý do rất chính đáng để giữ PulseAudio (PA) hoặc
phần mềm máy chủ JACK bổ sung , bạn nên gỡ cài đặt chúng , nếu chúng ở đó. Chúng có xu hướng can thiệp vào ALSA, vì chúng kiểm soát nhiều chức năng ALSA và tất cả các cấu hình bổ sung cần thiết cho những thứ đó, khiến mọi thứ trở nên vô cùng khó hiểu!
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. Vô hiệu hóa card âm thanh bên trong (Broadcom)
Soundcard bên trong được điều khiển bởi mô-đun hạt nhân trong:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
Trừ khi bạn dự định sử dụng giắc âm thanh (trong 1) hoặc HDMI (trong 2), bạn nên tắt mô-đun hạt nhân này. Có hai phương pháp để làm điều này.
- Vô hiệu hóa nó với một cờ cấu hình khởi động
- Ngăn không cho nó được tải vào kernel bởi
modprobe.d
daemon
Cố gắng ở lại với phương pháp tối giản của chúng tôi, chúng tôi chọn (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
Nếu vì lý do nào đó, bạn thích sử dụng phương thức (2), thì bạn cần đưa vào danh sách đen mô-đun hạt nhân. Để làm điều này, bạn chỉ cần nhập từ blacklist
, theo sau là tên của mô-đun trong bất kỳ *.conf
tệp nào dưới đây /etc/modprobe.d/
. Tuy nhiên, đã có một tập tin trống, dành riêng ở đó, được gọi raspi-blacklist.conf
cho mục đích này. Tuy nhiên, sau 6 tháng, bạn sẽ quên mất điều này và những gì nó chứa, vì vậy tốt hơn hết bạn nên đặt tên theo mô-đun mà bạn đang nằm trong danh sách đen.
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
Có gì khác biệt? Không, AFAICT.
Sau khi khởi động lại, kiểm tra lại các mô-đun âm thanh của bạn.
$ 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
Bom! Bcm2835 ( card 0
) khó chịu của bạn đã biến mất, nhưng chỉ số của thẻ USB là như nhau! Điều này thực sự tốt.
Định cấu hình ALSA của bạn
Như tôi đã đề cập, chúng tôi muốn ALSA sử dụng thẻ âm thanh USB của riêng chúng tôi làm mặc định. Điều này cũng có nghĩa là chúng tôi muốn nó có chỉ mục có sẵn đầu tiên trong danh sách các mô-đun âm thanh kernel. Vì mô-đun đã được gỡ bỏ ở trên và chỉ mục là như nhau (thẻ 1), chúng tôi là tốt. Nhưng trong trường hợp chúng ta cần phải bcm2835 tải một lần nữa, chúng tôi không, vì rằng mô-đun sẽ tái xuất hiện như là một trong những đầu tiên ( card 0
).
Chúng tôi chỉ đơn giản là cần phải nói với ALSA gì index thẻ giá trị mặc định của chúng tôi PCM nên
và theo thứ tự nào họ cần được ưu tiên trong kernel.
Có 3 nơi bạn có thể định cấu hình ALSA của mình.
- các cấu hình sử dụng trong:
~/.asoundrc
- các hệ thống cấu hình trong:
/usr/share/alsa/alsa.conf
- các mô-đun hệ thống conf trong:
/lib/modprobe.d/aliases.conf
2 cái đầu thay đổi các thiết bị mặc định, trong khi cái cuối cùng, đảm bảo thứ tự xuất hiện.
Trước tiên chúng tôi sửa cấu hình người dùng cụ thể của chúng tôi để sử dụng card 1
. Nếu bạn có nhiều thẻ được hiển thị, sau đó chọn chỉ mục của thẻ bạn muốn được mặc định.
#cat ~/.asoundrc
cat << EOF | tee ~/.asoundrc
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
EOF
Tiếp theo, chúng tôi sửa cấu hình hệ thống, sử dụng cùng số chỉ mục thẻ như trên. Chúng tôi cần phải làm điều này, bởi vì một số gói hệ thống sẽ không bao giờ thấy tệp cấu hình người dùng của bạn.
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
Bây giờ khởi động lại để những thay đổi có hiệu lực.
Bây giờ bạn nên có một hệ thống âm thanh làm việc.
Hãy thử nghiệm nó!
Để thực hiện kiểm tra thích hợp, bạn cần có các tệp thích hợp để kiểm tra. Vì vậy, trước khi bất cứ điều gì, hãy đảm bảo tất cả các tệp âm thanh và video của bạn đang thực sự hoạt động.
(Tôi đã dành thời gian đáng kể để thử một số video thử nghiệm h264 / mp4 để phát âm thanh, chỉ để khám phá sau đó, rằng nó chưa bao giờ có bất kỳ âm thanh nào được mã hóa! Duh!)
CẢNH BÁO Nếu bạn đang cố kiểm tra các video sử dụng MPEG-2
hoặc VC-1
codec, bạn phải
mua (!) Một khóa codec
từ tổ chức RPi để có thể giải mã hoàn toàn bằng bộ giải mã phần cứng tích hợp. Nếu không, bạn cần phải chuyển đổi các tập tin đầu tiên.
Bạn có thể kiểm tra xem codec của bạn có được bật hay không:
# Check with:
vcgencmd codec_enabled MPG2
vcgencmd codec_enabled WVC1
Bạn sẽ cần một số tập tin được xác minh để kiểm tra. Bạn có thể tải xuống và sử dụng chúng nếu bạn không có.
# 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
Tiếp theo, hãy CHƠI !!
# 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
BẠN TỐT ĐỂ ĐI!
[tùy chọn] Thứ tự phần cứng âm thanh bổ sung
LƯU Ý Nếu bạn sử dụng phần này, bạn cần thay đổi tất cả các giá trị chỉ số thẻ trong các phần trên!
Nếu bạn đã đính kèm phần cứng âm thanh bổ sung và nó không hiển thị như bạn muốn, bạn có thể buộc phải sắp xếp lại thứ tự xuất hiện các mô-đun trong /lib/modprobe.d/aliases.conf
tệp.
Một số giải pháp đã đề xuất để thực hiện thay đổi trong tập tin này. Thật không may, họ không biết rằng mô-đun âm thanh USB mặc định RPi bị sai chính tả! Vì vậy, những thay đổi không bao giờ có hiệu lực. Mô-đun hạt nhân âm thanh mà chúng tôi quan tâm, được gọi snd_usb_audio
và không snd-usb-audio
. Tên tệp là snd-usb-audio.ko
và nằm trong : /lib/modules/4.9.59-v7+/kernel/sound/usb/
.
Hài hước lắm, văn bản trong tập tin nói rằng nó không cần phải sửa đổi!
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
Người giới thiệu:
aplay
liên tục không làm gì sau tất cả công việc này, cho đến khi tôi sử dụng-D plughw:0,0
thay vì-D hw:0,0
(dựa trên shttps: //raspberrypi.stackexchange.com/a/89162). Thật không may, trong khi hầu hết mọi thứ bây giờ có thể phát âm thanh qua USB, tiện ích tôi cần hoạt động nhiều nhất (vban_receptor
) vẫn không hoạt động, nhưng tại thời điểm này, nó gần như chắc chắn không phải là lỗi của thiết lập nữa