3、ALSA工具链:alsamixer、aplay、arecord、speaker-test、amixer命令行实战
好,咱们直接进入正题。上一章我们把 ALSA 的驱动框架和逻辑设备理了一遍,说实话,光看代码和文档容易晕。我个人的习惯是——先动手,再回头看书。所以这一章,咱们就把 ALSA 工具链里的几个核心命令玩熟。
你想想看,在嵌入式 Linux 上调试音频,最怕什么?最怕驱动加载了,设备节点也有了,但就是没声音。这时候,alsamixer、aplay、arecord、speaker-test、amixer 这几个命令就是你的“听诊器”和“手术刀”。
3.1 工具链全家福:谁负责什么?
先给个总览,让你心里有个谱。这五个工具分工非常明确:
| 工具名 | 核心功能 | 我的使用场景 |
|---|---|---|
| alsamixer | 图形化混音器(终端内) | 快速查看/调节音量、切换声卡、查看录音/播放通路 |
| amixer | 命令行混音器控制 | 脚本自动化、远程调试、批量设置 |
| aplay | 播放 WAV 文件 | 验证播放通路、测试采样率/格式兼容性 |
| arecord | 录制 WAV 文件 | 验证录音通路、采集音频样本 |
| speaker-test | 扬声器测试(产生测试音) | 快速判断左右声道、检查破音/失真 |
说白了,alsamixer 和 amixer 管“通路和音量”,aplay 和 arecord 管“数据流”,speaker-test 管“声学质量”。
3.2 alsamixer:终端里的调音台
我个人最喜欢 alsamixer。它虽然是个终端程序,但界面非常直观。你输入 alsamixer 回车,就能看到类似调音台的界面。
核心操作速记:
- F6:切换声卡(多声卡系统必备)
- 左右方向键:选择控制项(比如 Master、PCM、Mic)
- 上下方向键:调节音量
- M 键:静音/取消静音(MM 表示静音,00 表示开启)
- Esc 或 Q:退出
嗯,这里要注意:很多新手一上来就调 Master,结果发现没声音。为什么?因为有些声卡的 PCM 通道默认是静音的。我曾经在一款 i.MX6 的板子上折腾了半小时,最后发现是 PCM 被 Mute 了。所以,进入 alsamixer 后,先按 F6 选对声卡,然后左右扫一遍,看到 MM 就按 M 键解开。
小技巧: 在 alsamixer 界面按 F5 可以查看所有控制项(包括录音相关的 Capture 和 Input Source)。按 F4 只看录音控制,按 F3 只看播放控制。
3.3 amixer:脚本里的“遥控器”
alsamixer 适合人机交互,但如果你要在启动脚本里自动设置音量,或者通过 SSH 远程调试,就得用 amixer 了。
amixer 的语法很直接:
# 查看当前声卡 0 的所有控制项
amixer -c 0 controls
# 查看某个控制项的详细信息
amixer -c 0 cget name='Master Playback Volume'
# 设置 Master 音量为 80%(假设范围是 0-255,80% 约等于 204)
amixer -c 0 cset name='Master Playback Volume' 204
# 更常用的简写方式(针对简单控制项)
amixer -c 0 set Master 80%
amixer -c 0 set Master unmute
amixer -c 0 set Mic 60% cap # 设置麦克风录音增益并开启捕获
避坑指南: 我曾经在批量生产测试脚本里直接用 amixer set Master 80%,结果发现某些声卡的音量范围不是线性的。有的声卡 80% 对应的实际增益已经破音了。建议你先用 amixer cget 查看 min/max 范围,再计算合适的值。
3.4 aplay 与 arecord:播放与录制的“试金石”
这两个命令是验证音频数据流是否通畅的最直接工具。它们的用法几乎对称。
3.4.1 aplay 播放测试
# 播放一个 WAV 文件(自动匹配格式)
aplay test.wav
# 指定设备播放(比如 card 1, device 0)
aplay -D hw:1,0 test.wav
# 列出所有可用的播放设备
aplay -l
# 列出所有 PCM 设备(包括软混音设备)
aplay -L
# 播放指定格式的原始数据(比如 16bit, 44100Hz, 双声道)
aplay -f S16_LE -c 2 -r 44100 test.raw
我个人最常用的组合是 aplay -l 先看设备列表,然后用 -D hw:0,0 直接指定硬件设备。为什么不用默认设备?因为默认设备可能经过 PulseAudio 或 ALSA 的 dmix 插件,绕过了硬件直接访问,有时候不利于排查底层问题。
3.4.2 arecord 录制测试
# 录制 5 秒的音频,保存为 WAV
arecord -d 5 test_record.wav
# 指定录音设备、格式、采样率
arecord -D hw:0,0 -f S16_LE -c 2 -r 44100 -d 5 test_record.wav
# 查看录音设备列表
arecord -l
实战经验: 我在调试一款全志 H3 的板子时,发现 arecord 录出来的文件全是静音。用 arecord -v 查看详细信息,发现录音通道的 Capture 开关是关闭的。这时候必须用 amixer -c 0 set Mic cap 或者 amixer -c 0 cset name='Mic Capture Switch' on 来开启录音通路。
3.5 speaker-test:声道的“体检仪”
speaker-test 是专门用来测试扬声器和声道的。它不需要 WAV 文件,直接产生正弦波、粉红噪声等测试信号。
# 最简单的测试(默认产生粉红噪声,左右声道轮流播放)
speaker-test
# 指定声道数(比如 2.0 系统)
speaker-test -c 2
# 指定测试音类型(正弦波,频率 440Hz)
speaker-test -t sine -f 440
# 指定声卡设备
speaker-test -D hw:0,0 -c 2
# 只测试左声道
speaker-test -c 2 -l 1 -s 1
你想想看,当你在产线上测试一批板子时,speaker-test 配合 -t sine 和 -f 1000,用耳朵一听就知道有没有破音、杂音。我曾经用 speaker-test 抓出过一批虚焊的音频功放——因为某个声道的声音明显偏小且带毛刺。
小技巧: 用 speaker-test -c 2 -t wav 可以播放自带的 WAV 语音(比如 "Front Left", "Front Right"),方便非技术人员判断声道是否正确。
3.6 知识体系:ALSA 工具链的调用关系
下面这张图帮你理清这些工具在 ALSA 架构中的位置:
3.7 实战组合拳:一个完整的调试流程
光讲命令没意思,咱们来一个真实的调试流程。假设你拿到一块新板子,音频驱动已经加载,但没声音。你会怎么做?
- 第一步:确认设备节点
ls -l /dev/snd/ # 应该看到 controlC0, pcmC0D0p, pcmC0D0c 等 - 第二步:查看声卡列表
aplay -l arecord -l - 第三步:检查混音器状态
alsamixer # 或者 amixer -c 0 scontrols确保 Master、PCM 没有被静音,音量在 70%-90%。
- 第四步:播放测试
speaker-test -c 2 -t sine -f 1000 -D hw:0,0如果能听到 1kHz 的正弦波,说明播放通路基本正常。
- 第五步:录制测试
arecord -D hw:0,0 -f S16_LE -c 2 -r 44100 -d 5 test.wav aplay test.wav # 回放验证
避坑指南: 我曾经在第五步卡了很久——录出来的文件播放全是噪音。后来发现是 采样率不匹配。板子的 Codec 只支持 48000Hz,而我用 44100Hz 去录。所以,录制前先用 amixer -c 0 cget name='PCM Rate' 确认硬件支持的采样率。
3.8 本章小结
这一章我们实战了 ALSA 工具链的五个核心命令。说白了,alsamixer 和 amixer 管“开关和音量”,aplay 和 arecord 管“数据流”,speaker-test 管“声学质量”。
我个人建议你把这几个命令的常用参数记在笔记里,或者写个简单的 shell 脚本。下次遇到音频问题,按流程走一遍,80% 的问题都能定位到。
嗯,工具链就讲到这里。记住,工具是死的,思路是活的。多动手,多听,多对比,你很快就能成为团队里的音频“老中医”。