除了 44.1kHz 之外的任何速率的 WAV 文件都弄乱了声音

WAV files at any rate except 44.1kHz have messed up sound

我在 Ubuntu 上使用 ALSA 来尝试播放 WAV 文件。目前,我能够读取 wav header 来计算文件的采样率,然后在 ALSA 上设置相应的参数。这非常适合采样率为 44.1kHz 的文件,但采样率为 ~11kHz 或 ~22kHz 的其他文件无法正确播放。我不确定我是否正确设置了采样率。

val = realSampleRate;
    //Sampling rate to given sampling rate
    snd_pcm_hw_params_set_rate_max(handle, params, &val, &dir);
    cout << "sampling at " << val << " Hz \n";

这给出了正确的输出("sampling at 22050 Hz"),但如果我按照这个进行操作:

val = realSampleRate;
snd_pcm_hw_params_set_rate_min(handle, params, &val, &dir);
cout << "sampling at " << val << " Hz \n";

输出继续说 "sampling at 44100 Hz" 这显然是矛盾的。我也尝试使用 snd_pcm_hw_params_set_rate_near 但这也不起作用,它说在 22050 文件上以 44100 Hz 采样,并且所有这些文件中的音频都非常混乱。

编辑:一个问题是不正确的采样率,这会加快播放速度,但真正的问题来自单声道。单声道音轨听起来真的很失真。

编辑:8 位文件也已关闭

在我看来,您的硬件无法处理 22.05Khz 的播放采样率。 API 函数 returns 不同的值这一事实是一个线索。

A​​LSA 只是一个 API。它只能做您当前的底层硬件能够支持的事情。低端、低端、廉价的音频播放硬件将支持少数采样频率,仅此而已。

我有一些自定义编写的音频录制和播放软件,它以特定速率采样和录制音频,然后使用 ALSA 的 aplay 播放它。当我得到一些新硬件时,我发现新硬件仍然能够支持我的录音采样率,播放它不支持,并且 aplay 只是继续以最近的可支持的速度播放以前录制的音频播放水平,结果很可笑。我不得不更改自定义编写的内容以支持的速率进行录制和播放。

如果硬件不支持您请求的播放速率,ALSA 将不会对您的原始音频数据重新采样。由您重新采样以进行播放。

snd_pcm_hw_params_set_rate_max()设置最大采样率,即当此功能成功时,设备的采样率不会大于您指定的值。

snd_pcm_hw_params_set_rate_min() 设置最小采样率。

snd_pcm_hw_params_set_rate_near()搜索设备实际支持的最接近的采样率,设置,然后returns。

如果您有特定采样率的音频数据,并且无法进行重采样,则必须使用snd_pcm_hw_params_set_rate()

使用 "default" 而不是 "hw:0,0" 解决了这个问题,包括采样率太慢。 "plughw:0,0" 也可以工作,而且更好,因为您可以通过编程方式 select 不同的 devices/cards 而默认值仅使用默认值。