当前位置: 首页 > 知识库问答 >
问题:

除了44.1kHz以外,任何频率的WAV文件都会弄乱声音

皮安顺
2023-03-14

我正在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\u pcm\u hw\u params\u set\u rate\u,但这也不起作用,它说在22050文件上以44100 Hz的频率采样,所有这些文件的音频都非常混乱。

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

编辑:8位文件也已关闭

共有3个答案

程正阳
2023-03-14

使用“default”而不是“hw:0,0”可以解决此问题,包括采样率太慢。“plughw:0,0”也可以使用,而且更好,因为您可以通过编程方式选择不同的设备/卡,而default只使用默认值。

公冶元青
2023-03-14

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

snd_pcm_hw_params_set_rate_min()设置最小采样率。

snd\u pcm\u hw\u params\u set\u rate\u near()搜索设备实际支持的最接近的采样率,进行设置并返回。

如果您有特定采样率的音频数据,并且无法进行重新采样,则必须使用snd\u pcm\u hw\u params\u set\u rate()。

公孙宏畅
2023-03-14

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

ALSA只是一个API。它只能做当前底层硬件能够支持的事情。低端、底层的el cheapo音频播放硬件将支持少量采样频率,仅此而已。

我有一些定制的音频录制和回放软件,它是以特定的速率采样和录制音频,然后使用ALSA的aplay回放。当我得到一些新的硬件时,我发现新的硬件仍然能够支持我录制时的采样率,而回放时却不能,而播放只是继续以最接近的可支持的回放级别播放以前录制的音频,结果很好。我不得不改变我的自定义文字,以支持的速率录制和播放。

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

 类似资料:
  • 我使用以下代码使用FFMPEG库将视频转换为: 在Windows(Chrome/Firefox)、Mac(Safari/Chrome)和Android(Chrome)中播放转换后的视频时,这一功能完美无缺,但在通过iOS(Safari/Chrome)观看时就不起作用了。 一开始我以为这可能是问题?但是我在我的iOS Safari中播放了这个视频https://www.w3schools.com/h

  • 问题内容: 我使用Python编写代码,我非常喜欢Notepad 。但是,当我使用制表符进行缩进时,在Notepad 中看起来很晚,但是当我运行该程序时,出现了缩进错误,并且当我在Emacs中检查代码时,我发现Notepad ++实际上增加了比制表符更多的空格。它显示在屏幕上。怎么了? 问题答案: 没有通用的制表符大小,因此我始终确保用空格替换制表符(因此您知道所看到的就是在其他任何地方都可以看到

  • 问题内容: 我有这个非常奇怪的问题。我有一个包含一些德语字母的网站,当它只是不带php的html时,当我将符号更改为UTF-8时,符号将显示为带有编码的属性,它们不会显示,而不是Ö。当我将html放入php并在Wamp上使用Zenset studio以charset = iso-8859-1编码启动时,得到�而不是Ö(我想补充一下,这个Ö是单选按钮的值) 。当它在一个 标签以正确显示。您能告诉

  • 问题内容: 嗨,我需要将wav音频文件的采样率从44.1kHz下采样到8kHz。我必须使用字节数组手动完成所有工作…这是出于学术目的。 我目前正在使用2个类(接收器和源)来弹出和推送字节数组。一切顺利,直到到达需要使用线性插值对数据块进行下采样的部分为止。 由于我是从44100降采样到8000 Hz,因此我该如何插入一个包含约128000000字节的字节数组?现在,我弹出5、6或7个字节,具体取决

  • 我的目标是同时播放多个mp3、ogg或wav音乐文件,以便在视频游戏中创建适应性强的音乐。 我没有使用java sound API中的Clip类,而是创建了一个名为Track的类,多亏了mp3spi和vorbisspi,它可以通过在SourceDataLine中写入音频数据来读取mp3、ogg和wav文件。多亏了这篇帖子,我找到了这个解决方案: https://stackoverflow.com/

  • 嘿,我是javascript的初学者,我遇到了这个问题。IF语句似乎将变量识别为它不是的东西。我想这和OR操作员有关? 因此它确实表示