本文将介绍如何在Linux中查看声卡信息,ALSA、pulseaudio框架以及与音频相关的工具。

硬件信息

查看声卡硬件信息

1
2
3
4
5
cat /proc/asound/cards	#列出主机上的声卡
lspci | grep -i audio #查看pci总线上的声音芯片集的名称和类型
lsusb | grep -i audio #查看usb总线上的声音芯片集的名称和类型
lsusb -t #可以以树形的方式更方便地查看usb设备
ls /sys/class/sound/ #查看当前系统中的所有音频设备

查看驱动信息

1
lsmod | grep snd

PulseAudio

PulseAudio 是一个音频服务器,它充当了你的应用程序和硬件设备之间的中间件。在一个系统中,它作为一个后台进程运行,接受来自一个或多个源的音频输入,然后将它们重定向到一个或多个接收点,例如声卡、蓝牙、远程网络上的 PulseAudio 服务器或其他进程。

pulseaudio控制命令如下

1
2
pulseaudio --check
pulseaudio -D

pulseaudio程序主要有两个配置文件:

  1. /etc/pluse/default.pa: 默认启动脚本
  2. /etc/pluse/daemon.conf: 配置文件

pulseaudio自带的命令行管理工具pacmd,使用方法如下:

1
2
3
4
5
6
pacmd stat			#查看pulseaudio状态
pacmd list-sources #列出所有输入设备
pacmd list-sink #列出所有输出设备
pacmd set-default-sink NAME|#N #设置默认输出设备
pacmd set-default-source NAME|#N #设置默认输入设备
pacmd set-(sink|source)-volume NAME|#N VOLUME #设置设备的音量

如果使用的是桌面系统,可以使用图形化管理工具PulseAudio Volume Control(pavucontrol)

1
sudo apt install pavucontrol

jack

JACK Audio Connection Kit (or JACK)是一个低延迟的实时音频服务器,主要用于音频编辑和音乐制作等专业应用,例如Ardour 、Audacity。它提供了更精细的音频控制和路由。
PulseAudio 是一个通用的音频服务器,主要面向普通桌面用户。它提供了更简单的音频管理功能,如音量控制、设备切换等。

jack和pulseaudio的区别如官网所述:

  • PulseAudio is focused on desktop and mobile audio needs. It doesn’t try to address low latency usage, but does provide seamless device switching, network routing, global per-application volume control and lots more great stuff.
  • JACK is focused on the needs of pro-audio and music creation users. It offers the lowest possible latency, complete routing flexibility between applications and audio hardware, and all audio is always sample synchronized - apps don’t run ahead or behind of others. It doesn’t provide the smooth desktop experience that PulseAudio is aiming at.

ALSA

ALSA(Advanced Linux Sound Architecture),它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。在2.6系列内核中,ALSA已经成为默认的声音子系统,用来替换2.4系列内核中的OSS(Open Sound System,开放声音系统)。有点类似与Linux中V4L2的视频架构。

1
sudo apt install alsa-base alsa-utils alsa-oss alsa-tools

配置音频

1
2
alsamixer	#ncurses配置界面
amixer #命令行配置界面

检查声卡设备

1
2
3
4
aplay -L	//检测播放设备
aplay -l //检测播放声卡
arecord -L //检测录音设备
arecord -l //检测录音声卡

录制音频,-D指定录音设备,-d指定录制时间,-r指定采样率,-c指定录音采样数。通过aplay -L命令,播放设备为”plughw:CARD=M1066,DEV=0”。

1
arecord -D plughw:CARD=M1066,DEV=0 -d 5 -r 16000 -c 1 ./test.wav

播放音频文件,由于wav文件中包含录制数据,因此只需指定播放设备

1
aplay -D plughw:CARD=M1066,DEV=0 ./test.wav

ALSA与PulseAudio的关系

ALSA(高级Linux声音体系)是为声卡提供驱动的Linux内核组件,以替代原先的OSS(开放声音系统).这两个是系统发出声音最低层的软件系统,可以视为(或者就是)驱动。

而PulseAudio是声音服务器,简单说,软件要发声就先发消息给声音服务器,然后声音服务器经过处理(主要是混音),然后发给驱动控制声音设备发出声音。

alsa是一套框架,应用层直接可以调用alsa lib发声音,但是混音上应该有些不足,操作可能比较复杂。pulseaudio,在alsa lib上又封装了一层,增加了很多pulseaudio自己定义的插件,这样大大扩展alsa lib的功能,同时混音方面也加强了。

1
2
没有pulseaudio:app-->alsa lib --->alsa driver--->发声音
有pulseaudio:app--->pulseaudio--->alsa lib--->alsa driver--->发声音
pulseaudio1 pulseaudio2

sox

SoX(即 Sound eXchange)可以将各种格式的音频文件转换为需要的其他格式,还可以对输入的音频文件应用各种效果,也支持在大多数平台上播放录制音频文件。

1
sudo apt install sox

获取音频文件的元数据

1
2
soxi test.wav
sox --i test.wav

录制与播放, sox的使用类似于ffmpeg,都是从左至右指定输入、filter、输出。

1
2
3
4
rec test.wav	#录制音频文件
sox -d test.wav #同上
play test.wav #播放音频文件
sox test.wav -d #同上

格式转换, sox可以根据参数文件的后缀推断出相应的格式, 并在复制音频数据的过程中自动进行转码。

SoX 可以处理 self-describingraw 格式的音频文件。 self-describing 格式(如 WAV、FLAC、MP3)的文件包含一个用于描述信号和编码属性的文件头,而 rawheadless 格式的音频则不包含这些信息。

1
sox test.wav test.mp3

查看sox提供的音频效果

1
2
sox --help-effect all	#查看所有效果
sox --help-effect delay #查看具体的效果

参考资料

  • alsa

https://www.cnblogs.com/gmpy/articles/16778302.html

https://wiki.archlinux.org/title/Advanced_Linux_Sound_Architecture

https://www.alsa-project.org/wiki/Main_Page

  • pulseaudio

https://wiki.archlinux.org/title/PulseAudio

https://unix.stackexchange.com/questions/249342/why-do-you-need-pulseaudio

https://www.freedesktop.org/wiki/Software/PulseAudio/

https://forum.ubuntu.org.cn/viewtopic.php?t=163776

https://tieba.baidu.com/p/3790145023