目录
在嵌入式 Linux 设备上,tinyplay
是一个轻量级的音频播放工具,适用于没有完整 ALSA aplay
工具的系统。但是,在使用 tinyplay
播放音频时,可能会遇到 “cannot set hw params: Invalid argument” 之类的问题。本文将详细介绍如何查看音频设备、检查支持的播放参数、播放音频文件,以及如何解决常见故障。
1. 查看可用的音频设备
在 Linux 系统中,所有的声卡信息都可以从 /proc/asound/cards
获取。
运行以下命令:
cat /proc/asound/cards
示例输出:
0 [jzacodec ]: jz-acodec - jz-acodec
jz-acodec
这表示系统上有一张名为 jzacodec
的声卡,设备编号为 0
。
2. 查看支持的 PCM 设备
运行以下命令查看 PCM 设备:
cat /proc/asound/pcm
示例输出:
00-00: 10020000.audio-controller:i2s-wt3132e-hifi wt3132e-hifi-0 : : playback 1 : capture 1
00-01: 10020000.audio-controller:i2s_t-pcm-dump pcm-dump-1 : : capture 1
00-00
表示hw:0,0
,支持播放和录音。00-01
只能录音,无法播放。
因此,在 tinyplay
里,我们应该使用 -D 0 -d 0
来指定播放设备。
3. 检查 tinyplay
的使用方式
运行以下命令查看 tinyplay
的参数:
./tinyplay --help
常见选项:
-D <card>
指定声卡编号-d <device>
指定设备编号-c <channels>
频道数(1=单声道, 2=立体声)-r <rate>
采样率(如 16000Hz)-b <bit>
位深度(如 16-bit)-i raw
以原始 PCM 格式播放
4. 尝试播放音频
如果 capture.wav
是标准 WAV 文件,使用以下命令播放:
./tinyplay capture.wav -D 0 -d 0
如果播放失败,可能是参数不匹配,尝试手动指定:
./tinyplay capture.wav -D 0 -d 0 -c 1 -r 16000 -b 16
如果 capture.wav
是 PCM 数据而非 WAV 格式,需要指定 -i raw
:
./tinyplay capture.wav -D 0 -d 0 -i raw -c 1 -r 16000 -b 16
5. 检查 capture.wav
文件格式
如果播放仍然失败,可能是 capture.wav
的格式不正确。
使用 file
命令查看文件类型:
file capture.wav
或者使用 hexdump
查看文件头部信息:
hexdump -C capture.wav | head -n 20
如果 capture.wav
不是 16kHz, 16-bit, 单声道
,可以使用 sox
进行转换:
sox capture.wav -r 16000 -c 1 -b 16 new_capture.wav
./tinyplay new_capture.wav -D 0 -d 0
6. 检查音频设备是否被占用
如果音频设备被其他进程占用,可以运行以下命令查看:
lsof | grep /dev/snd/
如果发现有进程占用,可以杀死进程:
kill -9 <进程ID>
或者重启 ALSA:
alsa force-reload
7. 确保 /dev/snd/
设备权限正确
运行以下命令检查 /dev/snd/
设备权限:
ls -l /dev/snd/
示例输出:
crw------- 1 root root 116, 0 Jan 1 08:00 controlC0
crw------- 1 root root 116, 24 Jan 1 08:00 pcmC0D0c
crw------- 1 root root 116, 16 Jan 1 08:00 pcmC0D0p
如果权限不正确,添加权限:
sudo chmod -R a+rw /dev/snd/
8. 检查驱动是否正确加载
运行以下命令查看驱动:
lsmod | grep snd
如果声卡驱动未加载,可以尝试手动加载:
modprobe snd_soc_wt3132e
(snd_soc_wt3132e
仅为示例,实际驱动名称可能不同,可在 dmesg | grep snd
查找相关信息)
9. 进一步故障排查
如果 tinyplay
仍然无法播放音频,请提供以下命令的输出:
cat /proc/asound/cards
cat /proc/asound/pcm
lsmod | grep snd
ls -l /dev/snd/
file capture.wav
这可以帮助确定是驱动、权限、文件格式还是设备占用问题。
总结
在嵌入式 Linux 设备上,使用 tinyplay
播放音频需要确保:
- 正确的音频设备(
cat /proc/asound/pcm
) - 正确的音频参数(
-D 0 -d 0 -c 1 -r 16000 -b 16
) - 音频文件格式匹配(
file capture.wav
) - 设备未被占用(
lsof | grep /dev/snd/
) - 驱动和权限正确(
lsmod | grep snd
和ls -l /dev/snd/
)