Linux中音频框架的学习与使用
本文将介绍如何在Linux中查看声卡信息,ALSA、pulseaudio框架以及与音频相关的工具。
硬件信息
查看声卡硬件信息
1 | cat /proc/asound/cards #列出主机上的声卡 |
查看驱动信息
1 | lsmod | grep snd |
PulseAudio
PulseAudio 是一个音频服务器,它充当了你的应用程序和硬件设备之间的中间件。在一个系统中,它作为一个后台进程运行,接受来自一个或多个源的音频输入,然后将它们重定向到一个或多个接收点,例如声卡、蓝牙、远程网络上的 PulseAudio 服务器或其他进程。
pulseaudio控制命令如下
1 | pulseaudio --check |
pulseaudio程序主要有两个配置文件:
/etc/pluse/default.pa
: 默认启动脚本/etc/pluse/daemon.conf
: 配置文件
pulseaudio自带的命令行管理工具pacmd,使用方法如下:
1 | pacmd stat #查看pulseaudio状态 |
如果使用的是桌面系统,可以使用图形化管理工具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 | alsamixer #ncurses配置界面 |
检查声卡设备
1 | aplay -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 | 没有pulseaudio:app-->alsa lib --->alsa driver--->发声音 |


sox
SoX(即 Sound eXchange)可以将各种格式的音频文件转换为需要的其他格式,还可以对输入的音频文件应用各种效果,也支持在大多数平台上播放和录制音频文件。
1 | sudo apt install sox |
获取音频文件的元数据
1 | soxi test.wav |
录制与播放, sox的使用类似于ffmpeg,都是从左至右指定输入、filter、输出。
1 | rec test.wav #录制音频文件 |
格式转换, sox可以根据参数文件的后缀推断出相应的格式, 并在复制音频数据的过程中自动进行转码。
SoX 可以处理 self-describing 和 raw 格式的音频文件。 self-describing 格式(如 WAV、FLAC、MP3)的文件包含一个用于描述信号和编码属性的文件头,而 raw 或 headless 格式的音频则不包含这些信息。
1 | sox test.wav test.mp3 |
查看sox提供的音频效果
1 | sox --help-effect all #查看所有效果 |
参考资料
- 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/