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

时间:2015-06-25 21:01:52

标签: c++ linux audio wav alsa

我在Ubuntu上使用ALSA尝试播放WAV文件。目前,我能够读取wav标头以找出文件的采样率,然后将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";

这给出了正确的输出(“以22050 Hz采样”),但是如果我按照它这样做:

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

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

编辑:一个问题是不正确的采样率,这将加快播放速度,但真正的问题来自单声道音轨。单声道跟踪声音非常扭曲,非常不合适。

编辑:8位文件也关闭

3 个答案:

答案 0 :(得分:1)

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

ALSA只是一个API。它只能执行您当前的底层硬件能够支持的功能。低端,低端,el-cheapo音频播放硬件将支持少数几个采样频率,以及它的相关信息。

我有一些自定义编写的录音和播放软件,它以特定的速率采样和录制音频,然后使用ALSA的aplay播放。当我得到一些新硬件时,我发现新硬件仍然能够支持我的录制采样率,对于播放它没有,而aplay只是继续播放以前录制的音频。最接近可支持的播放级别,结果非常糟糕。我不得不改变我自定义编写的东西,以支持的速度录制和播放。

如果硬件不支持您请求的播放速率,ALSA不会重新取样原始音频数据。您需要重新取样才能进行播放。

答案 1 :(得分:1)

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

snd_pcm_hw_params_set_rate_min()设置最低采样率。

snd_pcm_hw_params_set_rate_near()搜索设备实际支持的最近采样率,设置并返回。

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

答案 2 :(得分:0)

使用&#34;默认&#34;而不是&#34; hw:0,0&#34;解决这个问题,包括采样率太慢。 &#34; plughw:0,0&#34;也可以,并且它更好,因为你可以通过编程方式选择不同的设备/卡,而默认只使用默认值。