我在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位文件也关闭
答案 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;也可以,并且它更好,因为你可以通过编程方式选择不同的设备/卡,而默认只使用默认值。