我在RPi3上运行了来自C-Media的外部USB声卡。通过指定卡索引和ALSA插件,我可以使用aplay / arecord播放一些录音。但是,许多其他声音文件根本无法播放,或者无法正常播放。其他一些播放器软件也不起作用。

问:如何设置ALSA以默认使用它?

#1 楼

背景

令人惊讶的是,为解决Raspberry Pi的各种声音相关问题付出了很多努力。显然,对于新用户而言,它必须是Raspbian下最容易开发和使用ALSA的弱点。花费了大量的时间和精力来尝试使我自己的RPi3声音在不同的OS版本以及其他Linux
发行版中正常工作,我决定编写最终的解决方案
页面。至少要在最新的
Raspbian Stretch中使用外部声卡这一主题。

ALSA声音系统

ALSA旨在支持任何类型的基于* nix的设备,而不论其
硬件配置如何,以及硬件有多旧。毫无疑问,尝试了解
20年发展的细节毫无意义。我们只是将本质应用于当前情况。

但是,在历史上,人类从来没有创造出如此大量的无用的和功能失调的图表来解释ALSA。仅有的
能提供大量信息的是这两个:是要弄清楚什么声音(如果有的话)和您已经拥有的硬件
。有各种各样的方法可以找到交易细节,但是对于
普通人来说,大多数细节都是没有意义的。我们展示了最重要的


我们想知道什么关于我们的(声音)系统?

我们想知道:


内置声音硬件名称和版本
外部声音硬件名称和版本
它使用的内核驱动程序(模块)
其他与声音相关的内核驱动程序/模块被加载的
声卡是什么
操作系统和程序以什么顺序使用和选择声卡
如果存在任何冲突的硬件或声音系统程序

您要在哪里播放和录制系统上的声音?

您播放声音的选项可以是:


来自内部3.5毫米音频耳机插孔(模拟音频)
来自HDMI连接的屏幕/监视器
来自外部USB声卡
来自GPIO端口

用于录制声音的选项可以是:


a。通过外部USB声卡(具有至少一种输入类型) b。来自文件或流
c。通过GPIO

在本文中,我们将告诉您如何使用外部USB声卡进行播放和录制。

未来的成功计划?

随着RPi的更新,不断有新的变化和改进,
经常破坏旧的解决方案。这里的想法是对系统进行尽可能少的更改,或者在需要时将其显而易见。这意味着,
我们希望使用按用户配置,而不是系统范围的配置。即尝试
在主目录中使用配置文件,而不要在根
拥有的系统文件中使用配置文件。 />
重新启动并插入外部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守护程序装入内核

为了保持我们的简约方法,我们选择(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。


用户配置位于:~/.asoundrc

系统配置位于: /usr/share/alsa/alsa.conf

系统模块配置在:/lib/modprobe.d/aliases.conf


前2个更改默认设备,而最后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测试视频来播放音频,直到以后才发现它从来没有编码过任何音频!Du!)

警告如果您要测试使用MPEG-2VC-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/中。

有趣的是,文件中的文本指出它不需要修改! -bsh prettyprint-override“> 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


参考文献:



1 https://alsa.opensrc .org / Asoundrc


2 https://www.alsa-project.org/main/index.php/Asoundrc

[3]我如何在Raspbian Jessie上为Jasper配置我的声音?

[4] https://www.kernel.org/doc/html/latest/sound/index.html

[ 5] https://superuser.com/questions/989385/how-to-make-raspberry-pi-use-an-external-usb-sound-card-as-a-default

[ 6]学习和测试音频的好地方


评论


在Raspian上使用raspi 3B +,aplay在完成所有这些工作后始终没有执行任何操作,直到我使用-D plughw:0,0而不是-D hw:0,0(基于shttps://raspberrypi.stackexchange.com/a / 89162)。不幸的是,虽然现在几乎所有内容都可以通过USB播放音频,但是我最需要工作的实用程序(vban_receptor)仍然无法正常工作,但是在这一点上,几乎可以肯定,这不再是设置的问题

– Mike'Pomax'Kamermans
19年4月11日在19:20

是的,这是一场流血的噩梦。请在这里查看不同PCM插件的列表。然后在此处阅读名为“ ALSA设备和插件”的第一部分。也许这将有助于您了解为什么需要使用plughw而不是hw。顺便说一句。由于硬件直接用于硬件,而插件进行一些处理,因此您可能需要检查您实际尝试播放的内容。

–not2qubit
19年4月11日在22:51



我使用/ usr / share / sounds / alsa(特别是Front_Center.wav)中的沼泽标准测试音频文件之一对其进行了测试。

– Mike'Pomax'Kamermans
19年4月11日在23:03

你是绝对的明星。我没想到从树莓派中得到声音会是一个为期数天的项目,并且没有明确的操作指导。您的所有+1。

–基兰
19年4月16日在6:44

如此少的投票是犯罪的。

–BradChesney79
19年4月29日在21:58