ALSA:在特定音频设备上播放 WAV 文件会出现播放速率错误

ALSA:在特定音频设备上播放 WAV 文件会出现播放速率错误

我的 Ubuntu 22.04 设置中有多个音频源,包括耳机、HDMI 显示器和一个USB 音频插孔(连接到示波器)。我正在尝试从 USB 音频插孔播放 .WAV 文件,以便在示波器上查看它。

如果我使用不带任何标志的 aplay,我会在默认音频设备上播放 .WAV 文件:

aplay stereo_1kHz_sine_1sec.wav

如果我打开 Ubuntu 设置 -> 声音 -> 输出 -> 输出设备并将输出设备更改为“AB13X USB 音频”,那么我会在示波器上看到 1kHz 正弦波。同样,如果我将输出设备更改为显示器或耳机,我会在该设备上听到 1kHz 音调。所以,我知道所有硬件都工作正常。

我想向我的 aplay 命令添加标志,以便播放 .WAV 文件,而无需摆弄声音设置 GUI。我的最终目标是运行一些自动化音频测试,因此我想使用可以编写脚本的 CLI 命令。看着aplay 手册页,有一个 -D 标志用于指定目标 PCM 设备,所以我开始使用它。

我运行 aplay -l 来列出可用的 PCM 设备:

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA ATI HDMI], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA ATI HDMI], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA ATI HDMI], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA ATI HDMI], device 10: HDMI 4 [HDMI 4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: HDMI [HDA ATI HDMI], device 11: HDMI 5 [HDMI 5]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 7: HDMI 1 [HDMI 1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 8: HDMI 2 [HDMI 2]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 9: HDMI 3 [HDMI 3]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Generic_1 [HD-Audio Generic], device 0: ALC897 Analog [ALC897 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 4: Audio [AB13X USB Audio], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

我的设置同时具有集成显卡和 GPU,因此看到如此多的 HDMI 选项并不奇怪。通过一些实验,我弄清楚了我的设备在哪里。然而,当使用特定的目标设备调用 aplay 时,我的显示器和耳机上的播放音调要高得多。此外,我还收到警告消息,提示该费率不准确:

# Right monitor, recorded as freq 2kHz
$ aplay -D hw:0,3 stereo_1kHz_sine_1sec.wav
Playing WAVE 'stereo_1kHz_sine_1sec.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo
Warning: rate is not accurate (requested = 16000Hz, got = 32000Hz)
         please, try the plug plugin

# Left monitor, recorded as freq 2kHz
$ aplay -D hw:0,8 stereo_1kHz_sine_1sec.wav
Playing WAVE 'stereo_1kHz_sine_1sec.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo
Warning: rate is not accurate (requested = 16000Hz, got = 32000Hz)
         please, try the plug plugin

# Headphones, recorded as freq 2.75kHz
$ aplay -D hw:2,0 stereo_1kHz_sine_1sec.wav
Playing WAVE 'stereo_1kHz_sine_1sec.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo
Warning: rate is not accurate (requested = 16000Hz, got = 44100Hz)
         please, try the plug plugin

记录频率的差异与报告的速率误差一致,因此没有什么奇怪的。但我不清楚为什么 aplay 在用作默认设备时能够以正确的频率播放 .WAV 文件,但在命令行指定播放设备时却播放错误的速率/频率。

我在播放单声道 .WAV 文件时也遇到了问题。我可以让单声道 wav 文件在默认设备上播放,它们听起来与立体声版本相同。但是,当我指定播放设备时,单声道版本根本无法播放:

$ aplay -D hw:2,0 1kHz_sine_1sec.wav
Playing WAVE '1kHz_sine_1sec.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
aplay: set_params:1358: Channels count non available

我读过您可以为 ALSA 创建配置文件,例如$HOME/.asoundrc/etc/asound.conf.目前我的机器上没有这两个文件。如果默认音频设备有一个 ALSA 配置文件在幕后发挥着一些作用,我无法找到它。如果可能的话,我不想设置额外的配置文件。

我需要做什么才能从命令行将 .WAV 文件播放到特定音频设备,而不更改当前选择的默认音频设备?

我需要添加新的配置文件来完成此操作吗?

相关内容