Answers:
令人惊讶的是,为解决Raspberry Pi的各种声音相关问题付出了巨大的努力。显然,对于Raspbian而言,新用户必须能够成功开发并使用ALSA,这绝对是最薄弱的环节。我花了很多时间和精力来尝试使自己的RPi3声音在不同的OS版本和其他Linux发行版中都能正常工作,所以我决定编写最终的解决方案页面。至少关于在最新的Raspbian Stretch上使用外部声卡的主题 。
ALSA旨在支持任何类型的基于* nix的设备,而不管其硬件配置和硬件有多旧。毫无疑问,尝试深入了解 其20年的发展是没有意义的 。我们只是将本质应用于当前情况。
但是,在历史上,人类从来没有像试图解释ALSA那样产生如此大量的无用和功能失调的图表。仅有的提供远程指导的是以下两个:
第一步是弄清楚什么声音(如果有的话)起作用以及您已经拥有的硬件。有各种各样的方法可以找到细节,但是对于普通人来说,大多数细节都是没有意义的。我们展示最重要的。
我们想了解我们的(声音)系统什么?
我们想知道:
您想从哪里在系统上播放和录制声音?
播放声音的选项可以是:
录制声音的选项可以是:
在这篇文章中,我们将告诉您如何使用外部USB声卡播放和录制。
随着RPi的更新,不断有新的变更和改进,经常会破坏旧的解决方案。这里的想法是对系统进行尽可能少的更改,或者在需要时使其变得明显。这意味着,与系统范围的配置相比,我们更喜欢使用按用户配置。即,尝试在您的主目录中使用配置文件,而不要在拥有根的系统文件中使用。
重新启动并插入您的外部USB声卡,因此我们在同一页面上开始...
# 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声卡。
除非有很好的理由保留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
内部声卡由内核模块在以下位置驱动:
/lib/modules/4.9.59-v7+/kernel/sound/arm/snd-bcm2835.ko
除非您打算使用音频插孔(1中)或HDMI(2中),否则应禁用此内核模块。有两种方法可以做到这一点。
modprobe.d
守护程序将其加载到内核中为了保持我们的简约方法,我们选择(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使用我们自己的USB声卡作为默认设置。这也意味着我们希望它在内核声音模块列表中具有第一个可用索引。由于上面删除了模块,并且索引是相同的(卡1),所以我们很好。但是,如果我们需要再次加载bcm2835,则不必这样做,因为该模块将重新显示为第一个(card 0
)。
我们只需要告诉我们的ALSA默认PCM证指数应该是什么 以及在什么样的顺序,他们应该在内核中的优先级。
您可以在3个地方配置ALSA。
~/.asoundrc
/usr/share/alsa/alsa.conf
/lib/modprobe.d/aliases.conf
前两个更改默认设备,而最后一个确保外观顺序。
我们首先将用户特定的配置修复为use 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测试视频来播放音频,后来才发现它从来没有任何音频编码!encoded!)
警告如果尝试测试使用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
。
已提出一些解决方案来对此文件进行更改。不幸的是,他们不知道RPi默认USB声音模块拼写错误!因此,这些更改永远不会生效。声音内核模块,我们关心的是,被称为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
/usr/share/sounds/alsa
(特别是Front_Center.wav
)
aplay
在完成所有这些工作后始终没有执行任何操作,直到我使用-D plughw:0,0
代替为止-D hw:0,0
(基于shttps://raspberrypi.stackexchange.com/a/89162)。不幸的是,尽管几乎所有的东西都可以播放音频通过USB,公用事业我需要工作最(vban_receptor
)仍然无法正常工作,但在这一点上它几乎肯定不是设置的错了