首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同步变量与音频文件

同步变量与音频文件
EN

Stack Overflow用户
提问于 2016-07-10 03:33:02
回答 1查看 264关注 0票数 0

我有一个音频文件,我想要一个浮动变量与它同步。然后,浮动变量将用于创建正在播放的音频文件的图形指示。

我想要发生的事:

音频文件中的其他节拍(第一拍、第三拍、第五拍等等),变量应该是0.0f。其他拍子(第二拍、第四拍、第六拍等等),变量应为1.0f。

最重要的是,我希望随着时间的推移,在节拍之间“滑动”在0.0到1.0之间,我的第一个想法是在C++标准库中使用sin函数。

我所掌握的有关音频文件的信息:

  • 文件的速度/ BPM
  • 文件的长度(以秒为单位)
  • 音频文件总共包含多少次节拍
  • 当文件被回放时文件的位置。我知道这首歌的位置,几秒钟后,我就知道了。例如,如果这首歌播放了3秒半,我从我使用的函数中得到3.5f

除此之外,我还有一个增量和一个生命周期,它告诉应用程序已经执行了多长时间(以秒为单位)。

由于sin函数以浮点(或双)作为参数,我需要帮助的是计算,然后可以将其作为函数的参数传递,然后函数将用于生成与音频文件同步的正弦波。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-10 14:49:42

虽然这个解决方案不是硬的,但它应该能够检测到一个简单音频文件的节拍:

这里你可以看到一个简单的音频文件,你可以清楚地看到节拍。我们的目标是找到偏移值,这样我们就可以创建cos函数。找到偏移值的一种方法是首先计算文件的平均体积(通过获取音频数据的绝对值,因为如下所示,这些值会降到零下)。为了消除可能的噪声,我们计算了这个平均体积。接下来,我们循环遍历所有样本(您可能只需选择一个音频通道),并找到绝对值高于此平均值的第一个示例。这将产生一个偏移值(而不是秒)。

因为我们知道我们正在回放的是哪一秒,所以我们现在可以计算cos函数的值,它通过填充我们之前计算的函数的频率和偏移量来可视化音频。

请纠正我数学太差了

具有给定BPM的规则节拍应该如下所示。

BPS=BPM/60

g(x)=cos((x*BPS)*360)

然后,带有偏移量的节拍应该如下所示:

OFFSET_IN_SECONDS=OFFSET_IN_SAMPLES/SAMPLERATE

g(x)=cos((x*BPS+OFFSET_IN_SECONDS)*360)

重要:这些函数使用与弧度相反的度,C++使用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38288324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档