【问题标题】:Using the libsndfile library to read a WAV file in C++使用 libsndfile 库在 C++ 中读取 WAV 文件
【发布时间】:2013-07-06 15:08:01
【问题描述】:

我在 C++ 中使用 libsndfile 来读取 WAV 文件。有两点不明白:

  1. 如何获取相关 WAV 文件的“每个样本的位数”值?我阅读了网站 http://www.mega-nerd.com/libsndfile/api.html 上的文档,但我没有在 SF_INFO 结构中找到“每个样本的位数”的成员。
  2. 使用 WAV 文件,我如何创建数据以用于绘制用于描述声音数据的矢量,由库 sndfile.h 中的函数 sf_readf_float() 读取?有什么方法可以做到吗?

【问题讨论】:

  • 请改写第二个项目,因为它真的不是很清楚sf-readf_float() 函数是如何影响你想要做的事情的。

标签: c++ libsndfile


【解决方案1】:

格式字段将为您提供 BPS。例如:SF_FORMAT_PCM_16。

sf_readf_float 会将样本转换为 -1.0 到 1.0 的范围,无论输入声音的 bps 是多少。您只需要注意音频通道即可。如果音频有 2 个通道并且您读取 4 个浮点数,您将拥有:

sample-1 of left channel
sample-1 of right channel
sample-2 of left channel
sample-2 of right channel

然后,要绘制点,您必须将 [-1.0;1.0] 转换为视口高度。例如如果视口在 Y=20 且高度为 300px,则公式为:

PY = (int)(20.0 + (sample_value / 2.0 + 0.5) * 300.0);

【讨论】:

  • 感谢您的回复。但我还是不明白:(。首先,当我打印成员格式时,它是65538,但SF_FORMAT_PCM_16是2?这里的BPS是什么?其次,据我所知,如果我想画点,我必须将数据转换为时域信号?对吗?sf_readf_float读取的数据是时域信号,不是吗?
  • @Mauro 是对的。格式字段包含 2 个或可能 3 个组件。如果你用 SF_FORMAT_SUBMASK 按位与它,你会得到 SF_FORMAT_PCM_16。然后,您可以编写一个“开关(格式和 SF_FORMAT_SUBMASK)”来获取每个样本的位数。当然,这对于可能的压缩格式并不真正有效。
  • @Eric:哦哦,我明白了。非常感谢:D。第二个呢?能给我解释一下吗?
  • @user2530847:您使用 sf_readf_float 读取样本。它将返回您请求的样本计数,其中通道数据交错。所有样本的范围从 -1 到 1。然后您使用数学将样本转换为屏幕中的坐标。您需要哪些详细信息?
猜你喜欢
  • 1970-01-01
  • 2012-05-24
  • 2014-04-27
  • 1970-01-01
  • 2011-08-05
  • 2014-09-19
  • 2014-05-30
  • 1970-01-01
  • 2012-08-02
相关资源
最近更新 更多