如何使用外部USB声卡并将其设置为默认值?


16

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

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

Answers:


32

背景

令人惊讶的是,为解决Raspberry Pi的各种声音相关问题付出了巨大的努力。显然,对于Raspbian而言,新用户必须能够成功开发并使用ALSA,这绝对是最薄弱的环节。我花了很多时间和精力来尝试使自己的RPi3声音在不同的OS版本和其他Linux发行版中都能正常工作,所以我决定编写最终的解决方案页面。至少关于在最新的Raspbian Stretch上使用外部声卡的主题 。

ALSA音响系统

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

但是,在历史上,人类从来没有像试图解释ALSA那样产生如此大量的无用和功能失调的图表。仅有的提供远程指导的是以下两个:

在此处输入图片说明 在此处输入图片说明

获取系统信息

第一步是弄清楚什么声音(如果有的话)起作用以及您已经拥有的硬件。有各种各样的方法可以找到细节,但是对于普通人来说,大多数细节都是没有意义的。我们展示最重要的。

我们想了解我们的(声音)系统什么?

我们想知道:

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

您想从哪里在系统上播放和录制声音?

播放声音的选项可以是:

  1. 通过内部3.5毫米音频耳机插孔(模拟音频)
  2. 从HDMI连接的屏幕/监视器
  3. 从外部USB声卡
  4. 从GPIO端口

录制声音的选项可以是:

  • 一种。通过外部USB声卡(至少具有一种输入类型)
  • b。来自文件或流
  • C。从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中),否则应禁用此内核模块。有两种方法可以做到这一点。

  1. 使用启动配置标志禁用它
  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
  • 系统模块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-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_audiosnd-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

参考文献:


将raspi 3B +与Raspian一起使用,aplay在完成所有这些工作后始终没有执行任何操作,直到我使用-D plughw:0,0代替为止-D hw:0,0(基于shttps://raspberrypi.stackexchange.com/a/89162)。不幸的是,尽管几乎所有的东西都可以播放音频通过USB,公用事业我需要工作最(vban_receptor)仍然无法正常工作,但在这一点上它几乎肯定不是设置的错了
迈克Pomax“Kamermans

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

我使用了沼泽标准测试音频文件之一对它进行了测试/usr/share/sounds/alsa(特别是Front_Center.wav
Mike'Pomax'Kamermans,

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

3
如此少的投票是犯罪的。
BradChesney79 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.