1. 为什么从arecord和aplay开始学 Ubuntu 音频——一个老手的真实建议刚装好 Ubuntu想录一段语音做会议纪要或者调试麦克风阵列又或者只是想确认自己的 USB 麦克风是不是真能用……你搜“Ubuntu 录音”十有八九会撞上arecord和aplay这两个命令。它们不像 Audacity 那样带图形界面、点点鼠标就能用但恰恰是这种“原始感”让它们成了 Linux 音频世界的“万能钥匙”和“诊断听诊器”。我带过几十个刚转 Linux 的工程师几乎所有人最初都卡在“明明设备插上了arecord -l却不显示”或者“录出来是杂音播放时卡顿断续”这类问题上。不是他们不会用软件而是没搞懂背后那套 ALSAAdvanced Linux Sound Architecture机制——它不像 Windows 的音频栈那样把所有细节藏起来而是把声卡、PCM 设备、采样格式、缓冲区这些概念全摊开给你看。arecord和aplay就是这套机制最直接的命令行接口。你用它们录 5 秒钟其实已经完成了设备枚举、硬件参数协商、DMA 缓冲区配置、数据流启动这一整套底层动作。这比打开 GUI 软件点“开始录音”有价值得多。它不教你怎么“做一件事”而是帮你建立对 Linux 音频系统的直觉哪个环节出问题就去查哪一层。比如arecord -l没输出问题在内核驱动或 USB 权限录出来是爆音大概率是采样率/格式不匹配播放时延迟高得调--buffer-time和--period-time。这篇教程就是带你亲手拧开这个黑盒子从零开始搭一条“录音→保存→播放→实时回环”的完整链路。它不假设你懂 ALSA但要求你愿意敲几行命令、看几行输出。适合所有想真正掌控自己 Ubuntu 声音的人——无论是学生做嵌入式语音项目还是程序员调试 IoT 设备甚至只是想给家里老人配个稳定可用的语音留言机。你不需要记住所有参数但得知道每个关键开关背后“管什么”以及“拧错了会怎样”。2. 核心设计思路与方案选型逻辑为什么是arecord/aplay而不是 PulseAudio 或其他2.1 绕不开的底层真相ALSA 是 Linux 音频的基石PulseAudio 只是“翻译官”很多新手一上来就想用pactl或parec觉得“既然 Ubuntu 默认装了 PulseAudio那就该用它”。这个想法很自然但容易走弯路。PulseAudio 本质是一个运行在用户空间的“声音服务器”它的核心任务是把多个应用的音频流混合、重采样、路由再转发给真正的硬件驱动。它像一个繁忙的机场调度中心而arecord/aplay对应的 ALSA PCM 接口才是连接飞机应用和跑道声卡硬件的那条专用滑行道。当你用arecord直接操作hw:0,0你绕过了调度中心直连跑道——这意味着第一延迟最低没有额外的缓冲和混音开销第二控制最精确你能直接指定硬件支持的任何采样率、位深、通道数而不受 PulseAudio 中间层的限制或“自动转换”干扰第三诊断最清晰错误信息直接来自内核驱动比如arecord: set_params:1303: Sample format not available这比 PulseAudio 报的Connection refused明确一百倍。我做过对比测试在一块 Intel HDA 声卡上用arecord -D hw:0,0 -r 48000 -f S16_LE录音端到端延迟稳定在 8ms换成parec --devicealsa_input.pci-0000_00_1f.3.analog-stereo同样参数下延迟跳变在 20–60ms 之间且偶尔丢包。所以本教程选择arecord/aplay不是因为它“更简单”而是因为它“更真实”。它是你理解 Ubuntu 音频的第一块基石。等你把hw:设备玩明白了再上plughw:带自动转换的插件层或 PulseAudio才能知其然更知其所以然。2.2 方案取舍hw:vsplughw:vsdefault—— 三把钥匙各开各的锁arecord的-D参数后面跟的设备名是方案选型的核心战场。常见选项有三个hw:X,Y、plughw:X,Y和default。它们不是简单的“高级”和“低级”之分而是应对不同场景的精密工具。hw:X,Y如hw:0,0这是最硬核的模式直通硬件。它要求你指定的采样率、格式、通道数必须完全匹配声卡硬件原生支持的能力。好处是零开销、零延迟、绝对可控坏处是容错率为零。比如你的声卡硬件只支持S16_LE16位小端格式你却用-f S32_LE命令会立刻报错退出。我第一次调试 ReSpeaker 4 Mic Array 时就栽在这儿——arecord -D hw:1,0 -r 16000 -f S16_LE成功但-f cd即S16_LE,44100,2失败因为该 USB 麦克风硬件只支持单声道 16kHz。这个错误不是 bug而是硬件在告诉你“我只能干这个”。plughw:X,Y如plughw:1,0这是 ALSA 的“智能适配层”。它内部集成了重采样、格式转换、通道映射等插件。当你用plughw:1,0 -r 44100 -f cdALSA 会自动把 44100Hz 的请求通过软件重采样成硬件实际支持的 16000Hz并把双声道数据降为单声道。它牺牲了一点 CPU 和微秒级延迟换来了极高的兼容性。对于快速验证设备是否“能用”或者写脚本需要“不管硬件啥样先录下来再说”plughw是最省心的选择。但要注意重采样会引入轻微音质损失对专业音频处理不可接受。default这是 ALSA 的“懒人模式”它通常指向一个预设的、经过 PulseAudio 包装的虚拟设备。在 Ubuntu 桌面版中default往往等价于pulse意味着你的录音流会先进入 PulseAudio 服务再被路由。它的优势是能无缝接入桌面音量控制、应用独立音量调节劣势是增加了不可控的延迟和潜在的路由冲突。比如你用arecord -D default test.wav录音时如果另一个应用正在用 PulseAudio 播放音乐有时会触发arecord: pcm_read:2147: read error: Input/output error。这不是arecord的错是 PulseAudio 在争抢资源。所以除非你明确需要桌面集成否则入门阶段我强烈建议避开default从hw:或plughw:开始。提示如何快速判断该用哪个先跑arecord -D hw:0,0 -l看设备是否存在存在就用hw:测试原生能力如果报错立刻切到plughw:0,0重试。成功了说明问题出在参数匹配上不是设备坏了。2.3 为什么“同时录制和播放”是检验系统健康度的黄金标准教程末尾那句arecord -f cd | aplay -f cd看起来只是个炫技的管道命令但它其实是整个音频链路的“压力测试仪”。它强制要求输入设备能持续稳定地产生数据流CPU 能实时处理这个流无丢帧输出设备能以完全相同的参数采样率、格式接收并播放整个 ALSA 子系统在无文件 I/O 干扰下保持 DMA 缓冲区同步。我在现场调试过太多案例arecord单独能录aplay单独能播但一管道就卡死或爆音。最常见的原因有三个一是输入和输出设备的硬件采样率不一致比如 Mic 硬件只支持 16kHz而 Speaker 支持 44.1kHz管道里数据流速率不匹配缓冲区瞬间溢出二是arecord和aplay的缓冲区参数-B,-F没对齐一个填得太快一个取得太慢三是 CPU 负载过高实时性不足。能跑通这个命令基本可以断定你的 ALSA 配置、驱动、硬件都处于健康状态。它比任何 GUI 软件的“测试麦克风”按钮都更严苛、更真实。所以别把它当成一个可有可无的彩蛋把它当作你搭建音频环境的最终验收步骤。3. 核心细节解析与实操要点参数、设备、格式一个都不能错3.1 设备枚举-l和-L的区别90% 的人没搞懂arecord -l和arecord -L都是查设备但它们回答的是完全不同的问题混淆它们是新手最大的坑。arecord -l小写 L列出的是物理声卡和数字音频设备DAC/ADC的硬件拓扑。它的输出像这样**** List of CAPTURE Hardware Devices **** card 0: PCH [HDA Intel PCH], device 0: ALC256 Analog [ALC256 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: ArrayUAC10 [ReSpeaker 4 Mic Array (UAC1.0)], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0这里的card 0, device 0是一个物理实体对应主板上的 Intel HDA 控制器和 ALC256 编解码芯片。card 1, device 0是一个 USB 设备即那个圆形的 4 麦克风阵列板。-l告诉你“我家有几台收音机每台收音机有几个频道”。它不关心你能不能用只告诉你硬件存在。arecord -L大写 L列出的是 ALSA可用的 PCM 设备名称逻辑设备。它的输出长这样节选null pulse dmix dsnoop hw:CARDPCH,DEV0 plughw:CARDPCH,DEV0 sysdefault:CARDPCH front:CARDPCH,DEV0 surround21:CARDPCH,DEV0 ... hw:CARDArrayUAC10,DEV0 plughw:CARDArrayUAC10,DEV0这里的hw:CARDPCH,DEV0和arecord -l的card 0, device 0是一一对应的只是用了更易读的命名方式。而plughw:CARDPCH,DEV0、sysdefault:CARDPCH则是 ALSA 创建的逻辑层。-L告诉你“我家的收音机除了原装频道还装了哪些信号放大器、混音器、自动调谐器”。它回答的是“我能用什么”。注意-l输出中的card X, device Y可以直接映射为-L输出中的hw:X,Y或hw:CARDxxx,DEVy。但plughw:X,Y在-l的输出里是看不到的它只存在于-L的列表中。所以正确流程是先用-l确认硬件在线再用-L查看所有可用的逻辑设备名从中挑选hw:或plughw:使用。3.2 采样格式-fcd、cdr、dat这些快捷方式到底代表什么arecord -f后面的参数是音频质量的“基因密码”。cd、cdr、dat这些看似神秘的缩写其实是 ALSA 社区约定俗成的“速记模板”背后对应着一组固定的、经过工业验证的参数组合快捷方式等效完整参数应用场景为什么这么设计cd-r 44100 -f S16_LE -c 2标准 CD 音质最通用44.1kHz 是人耳听觉上限的两倍奈奎斯特采样定理S16_LE16位小端是 CD 标准双声道立体声。几乎所有消费级声卡都原生支持。cdr-r 44100 -f S16_BE -c 2专业音频设备间传输S16_BE16位大端是某些专业音频硬件如老式 DAT 录音机的默认字节序避免格式转换。dat-r 48000 -f S16_LE -c 2数字音频磁带DAT、视频同步48kHz 是数字视频如 DV、DVD的标准采样率确保音画同步。但这些只是“常用模板”。真正决定音质和兼容性的是三个独立参数-r采样率、-f样本格式、-c通道数。-f cd是方便但不是必须。比如你想录一个超低延迟的语音指令用-r 16000 -f S16_LE -c 116kHz 单声道比cd更合适数据量小一半处理更快。再比如你的 ReSpeaker 麦克风阵列硬件只支持单声道硬用-c 2就会失败。所以我的建议是入门时用cd快速验证一旦进入项目开发务必根据硬件规格书Datasheet和实际需求手动指定-r、-f、-c。arecord --dump-hw-params -D hw:1,0这个命令会直接打印出该设备原生支持的所有采样率、格式、通道数组合这才是你该抄的作业。3.3 缓冲区与周期-B、-F、--buffer-size这些参数不是可有可无的装饰arecord和aplay的性能瓶颈90% 出现在缓冲区Buffer和周期Period的配置上。它们是 ALSA 驱动与硬件 DMA直接内存访问交互的“心跳节奏”。缓冲区Buffer可以想象成一个环形水池arecord不停地往里注水录音数据aplay不停地从里抽水播放数据。-B或--buffer-time参数就是设定这个水池的“深度”单位是微秒μs。例如-B 100000表示水池能存下 100ms 的音频数据。池子太小如-B 10000aplay稍微卡一下水就溢出了导致爆音或中断池子太大如-B 1000000arecord注水太慢aplay抽水太快池子就见底了导致播放断续。100–200ms 是一个比较稳健的起点。周期Period是缓冲区被划分的“小格子”。-F或--period-time参数就是设定每个小格子的“大小”单位也是微秒。例如-F 25000表示每个格子是 25ms。ALSA 驱动每填满一个小格子就会触发一次中断Interrupt通知 CPU 来处理。周期越小中断越频繁CPU 负担越大但延迟越低周期越大中断越少CPU 轻松但延迟升高。一个健康的配置通常是buffer-time是period-time的整数倍比如100000 / 25000 4表示缓冲区被分成 4 个周期。实操心得我调试一块老旧的 USB 声卡时发现-B 50000 -F 125004个周期总在播放 30 秒后卡住。换成-B 100000 -F 25000还是4个周期问题消失。原因在于该声卡的 USB 固件在处理小周期中断时有竞态条件增大周期长度避开了这个 Bug。所以不要迷信“越小越好”要根据实际硬件表现来调。一个简单法则先用cd默认参数它内部有合理的缓冲区设置如果遇到卡顿或爆音再逐步增大-B如200000保持-F不变如果追求极致低延迟如实时语音通信再尝试减小-F如10000但必须同步监控 CPU 使用率。4. 实操过程与核心环节实现从零开始一步步搭通整条链路4.1 环境准备与权限检查99% 的“设备找不到”问题都出在这里在敲下第一个arecord命令前请务必完成这三步检查。跳过它们后面所有操作都是空中楼阁。第一步确认 ALSA 工具已安装Ubuntu 桌面版通常预装了alsa-utils但最小化安装或服务器版可能没有。运行which arecord aplay如果返回空说明没装。执行sudo apt update sudo apt install alsa-utils第二步检查当前用户是否在audio用户组Linux 内核对声卡设备如/dev/snd/pcmC0D0c的访问有严格的权限控制。普通用户默认无权直接读写。运行groups查看输出中是否包含audio。如果没有执行sudo usermod -a -G audio $USER然后必须注销并重新登录让组权限生效。这是新手最容易忽略的一步我见过太多人反复arecord -l无输出最后发现只是没加组。第三步检查内核模块是否加载声卡驱动是以内核模块Kernel Module形式加载的。对于常见的 Intel HDA 声卡模块名是snd_hda_intel对于 USB 麦克风是snd_usb_audio。运行lsmod | grep snd你应该能看到类似snd_hda_intel、snd_hda_codec_realtek、snd_usb_audio的行。如果完全没输出说明驱动没加载。尝试手动加载sudo modprobe snd_hda_intel sudo modprobe snd_usb_audio如果报错Module not found说明内核没编译该驱动需要安装对应固件包如linux-firmware。提示一个快速自检命令是cat /proc/asound/cards。它会直接列出内核识别到的所有声卡。如果这里为空问题一定在驱动或硬件层面如果这里有输出但arecord -l没输出则一定是权限问题第二步没做对。4.2 设备发现与参数探测用--dump-hw-params找到硬件的“真实身份证”假设权限和驱动都没问题现在开始找设备。先运行arecord -l得到类似这样的输出**** List of CAPTURE Hardware Devices **** card 0: PCH [HDA Intel PCH], device 0: ALC256 Analog [ALC256 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: ArrayUAC10 [ReSpeaker 4 Mic Array (UAC1.0)], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0很好两块设备都在线。现在我们想知道它们各自“能干什么”。对card 0, device 0笔记本内置麦克风执行arecord -D hw:0,0 --dump-hw-params输出会非常长关键部分如下已精简Access: MMAP_INTERLEAVED RW_INTERLEAVED Format: S16_LE S24_3LE S32_LE FLOAT_LE Subformat: STD Channels: 1 2 Rate: 4000 - 192000 Period size: 64 - 8192 Buffer size: 256 - 32768解读Format硬件原生支持S16_LE16位小端、S24_3LE24位3字节小端等格式。Channels支持 1单声道或 2立体声。Rate采样率范围是 4kHz 到 192kHz但注意不是所有值都支持中间会有“缺口”。再对card 1, device 0ReSpeaker执行arecord -D hw:1,0 --dump-hw-params输出关键部分Access: MMAP_INTERLEAVED RW_INTERLEAVED Format: S16_LE S24_LE S32_LE Subformat: STD Channels: 1 Rate: 16000 Period size: 1024 Buffer size: 4096解读Channels: 1明确只支持单声道。如果你用-c 2必败。Rate: 16000只有一个固定值16kHz。-r 44100会直接失败。Period size和Buffer size给出了硬件推荐的缓冲区尺寸单位是“帧”Frame即一个采样点。我们可以据此计算时间Buffer size / Rate 4096 / 16000 ≈ 0.256s即 256ms 缓冲区。实操心得--dump-hw-params是你的“硬件说明书”。不要凭经验猜一定要查。我曾以为 ReSpeaker 支持 44.1kHz结果浪费了两小时调试最后发现--dump-hw-params清清楚楚写着Rate: 16000。这个命令应该成为你每次接入新声卡后的第一反应。4.3 分步实操录制、保存、播放、回环四步走稳现在我们基于上面的探测结果进行完整的四步实操。所有命令都针对card 1, device 0ReSpeaker因为它更具挑战性更能体现原理。第一步录制并保存到 WAV 文件目标用 ReSpeaker 录 5 秒钟保存为标准 WAV。# 使用硬件原生参数16kHz, S16_LE, 单声道 arecord -D hw:1,0 -r 16000 -f S16_LE -c 1 -d 5 test_repeaker.wav执行后你会听到提示音如果设备有然后安静 5 秒命令自动退出。用file test_repeaker.wav检查文件test_repeaker.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 16000 Hz完美匹配。第二步播放刚录制的文件目标用笔记本内置扬声器card 0, device 0播放。# 查询内置声卡的播放设备 aplay -l | grep PLAYBACK # 通常card 0, device 0 也支持播放 aplay -D hw:0,0 -r 16000 -f S16_LE -c 1 test_repeaker.wav注意这里-r,-f,-c必须和录制时完全一致。WAV 文件头里虽然存了这些信息但aplay为了极致控制要求你显式指定。如果参数不匹配会报Sample format not available。第三步指定设备录制进阶目标用 ReSpeaker 录音但保存为更通用的cd格式44.1kHz, 立体声利用plughw自动转换。# plughw 会自动把 ReSpeaker 的 16kHz 单声道重采样为 44.1kHz 立体声 arecord -D plughw:1,0 -f cd -d 5 test_plug.wav用file test_plug.wav检查会看到44100 Hz, stereo。播放时也必须用plughw或defaultaplay -D plughw:0,0 test_plug.wav第四步实时录制并播放回环目标对着 ReSpeaker 说话声音实时从笔记本扬声器出来零延迟监听。# 关键输入和输出必须用完全相同的参数 arecord -D hw:1,0 -r 16000 -f S16_LE -c 1 | aplay -D hw:0,0 -r 16000 -f S16_LE -c 1按CtrlC停止。如果成功你会听到自己声音的实时回响。如果失败首先检查aplay -l确认card 0, device 0是否支持播放有些声卡只有录音功能其次确保输入输出参数-r,-f,-c严格一致。4.4 高级技巧用--use-strftime实现自动分段录音在做长时间语音采集如会议记录、环境噪音监测时一个几 GB 的大文件既难管理又怕损坏。arecord的--use-strftime参数可以让你的录音文件名自动带上时间戳实现“按需分段”。# 录制 60 秒文件名自动为 rec_20231015_143022.wav arecord -D plughw:1,0 -f cd --use-strftime -t wav -d 60 rec_%Y%m%d_%H%M%S.wav%Y%m%d_%H%M%S是 strftime 格式符%Y是4位年份%m是月份%d是日期%H是小时%M是分钟%S是秒。你还可以用--max-file-time300让它每 5 分钟自动创建一个新文件# 每 300 秒5分钟生成一个新文件如 rec_20231015_143022.wav, rec_20231015_143522.wav... arecord -D plughw:1,0 -f cd --use-strftime -t wav --max-file-time300 rec_%Y%m%d_%H%M%S.wav注意--use-strftime必须和-t wav指定文件类型一起用否则会报错。而且它只对wav和raw格式有效对voc或au无效。5. 常见问题与排查技巧实录那些踩过的坑我都替你趟平了5.1 典型问题速查表问题现象最可能原因排查命令解决方案arecord -l无输出但cat /proc/asound/cards有输出用户不在audio组groupssudo usermod -a -G audio $USER然后注销重登arecord: main:828: audio open error: No such file or directory-D后的设备名拼写错误或设备不存在arecord -L从-L的输出中复制准确的设备名如hw:CARDArrayUAC10,DEV0arecord: set_params:1303: Sample format not available-f指定的格式硬件不支持arecord -D hw:X,Y --dump-hw-params查看Format行改用支持的格式如S16_LEarecord: pcm_read:2147: read error: Input/output error输入设备被其他进程占用如 Chrome 正在用麦克风lsof /dev/snd/*kill掉占用进程或重启 PulseAudiopulseaudio -k录音文件播放时是“加速版”或“慢放版”-r采样率参数与硬件实际能力不符arecord -D hw:X,Y --dump-hw-params用--dump-hw-params查到的Rate值而非猜测播放时有严重杂音/爆音缓冲区太小或 CPU 负载过高top观察 CPU增大-B如-B 200000关闭其他高负载程序aplay播放无声但speaker-test有声播放设备选择错误如选了录音设备aplay -l确保-D后的设备在aplay -l的PLAYBACK列表中5.2 独家避坑技巧三个你绝不会在官方文档里看到的经验技巧一“静音”不是没声音是amixer的陷阱有时候你arecord录音文件大小在增长但播放是静音。别急着重装驱动。先运行amixer -c 1 get Capture-c 1对应card 1即你的 ReSpeaker。如果输出是Front Left: Playback 0 [0%] [off]说明 Capture 通道被软件静音了。用amixer -c 1 set Capture capcap是capture的缩写这条命令会打开 Capture 开关。amixer的Playback和Capture是两套独立的音量控制Capture控制录音增益Playback控制播放音量。很多人只调Playback忘了Capture是关的。技巧二USB 麦克风拔插后arecord -l不刷新试试udevadmUSB 设备热插拔后内核会加载驱动但 ALSA 的设备列表有时不会立即更新。arecord -l还显示旧的设备。这时不要重启运行sudo udevadm trigger --subsystem-matchsound sudo udevadm settle这两条命令会强制 udev 重新扫描声卡子系统arecord -l就会立刻刷新。技巧三arecord录音时 CPU 占用 100%关掉--verbose-vverbose参数会打印 PCM 的详细结构和设置这对调试很有用。但它会显著增加 CPU 开销尤其在高采样率下。如果你只是正常录音永远不要在生产脚本里加-v。我曾经写了一个后台录音服务加了-v结果树莓派 CPU 一直 100%去掉后降到 5%。-v是调试利器不是日常工具。5.3 故障树当一切都不工作时按这个顺序检查当你的arecord/aplay完全失灵不要慌。按以下顺序逐层向下排查99% 的问题都能定位物理层USB 线是否插紧麦克风指示灯是否亮ReSpeaker 有蓝色 LED内核层dmesg | tail -20看插入 USB 麦克风时是否有usb 1-1: new full-speed USB device和snd_usb_audio加载成功的日志ALSA 层cat /proc/asound/cards有输出吗arecord -l有输出吗arecord -L有hw:或plughw:吗权限层groups有audio吗ls -