gpt4 book ai didi

c++ - 将变量与音频文件同步

转载 作者:行者123 更新时间:2023-12-03 01:52:45 27 4
gpt4 key购买 nike

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

我想发生的事情:

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

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

我拥有的有关音频文件的信息:

  • 文件的速度/BPM
  • 文件长度(秒)
  • 音频文件总共包含多少个节拍
  • 文件在播放时的位置。
    我知道歌曲中的位置,几秒钟后,我现在在哪里。例如,如果歌曲播放了 3 秒半,我从我正在使用的函数中得到 3.5f

  • 除此之外,我还有一个 deltatime 和一个生命周期,它表明应用程序执行了多长时间(以秒为单位)。

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

    最佳答案

    虽然这个解决方案不是坚如磐石,但它应该能够检测到简单音频文件的节拍:
    image
    在这里您可以看到一个简单的音频文件,您可以清楚地看到节拍。我们的目标是找到偏移值,以便我们可以创建我们的 cos 函数。找到偏移值的一种方法是首先计算文件的平均音量(通过获取音频数据的绝对值,因为值会低于零,如下所示)。我们计算这个平均音量是为了消除可能的噪音。接下来,我们遍历所有样本(您可能只选择一个音频 channel )并找到绝对值高于此平均值的第一个样本。这会产生样本中的偏移值(不是秒)。

    由于我们知道当前播放的时间,我们现在可以通过填充我们之前计算的函数的频率和偏移量来计算可视化音频的 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++ 使用的弧度相反

    关于c++ - 将变量与音频文件同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38288324/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com