操纵音频文件与FMOD

Manipulate audio file with FMOD

本文关键字:FMOD 文件 音频 操纵      更新时间:2023-10-16

根据我上一个问题的评论,我太宽泛了。所以,我会尽量问一些具体的问题。

<<p> 上下文/strong>

我想用c++开发一个非常非常简单的版本的软件"Audacity";换句话说,这是一款能够通过图形用户界面操作音频文件的软件。例如,我想选择一个声音a的摘录(开始和结束点-在XX:XX和YY:YY之间),然后剪切/复制它,然后粘贴另一个声音B(在ZZ:ZZ),混合两个或更多的声音,等等。

我发现了什么

如果哪一点不对,请及时纠正我。

首先,我想我将使用Qt来制作图形用户界面。我看到Qt也可以管理音频文件,但是,我觉得它不能真正地操作它们(剪切/粘贴,混合,…)。

我不知道音频文件是如何工作的,操纵它们也可能很复杂,因为有多种格式,比特率,声音混合……所以,我搜索了一个库来方便操作,我找到了FMOD Ex API。

然后,我读了安装附带的文档,我找到了一些答案…和一些问题。

  • 麦克风录音

可以使用System::recordStart和其他一些方法。

  • 在扬声器上播放歌曲

这是可能的,它是默认的输出:System::playSound.

  • 同时播放多个声音

我已经看到它可以用多个通道来完成:我们首先初始化一个带有几个通道的System对象,然后我们可以播放几个音乐:对于每个,我们调用System::createSound和System::playSound。我们还需要使用System::update.

进行更新。
  • 保存声音

这与播放歌曲的方式相同:System::playSound。我们只需要在System::setOutput(FMOD_OUTPUTTYPE_WAVWRITER)之前改变输出。

  • 保存多个声音的混音

我认为我们只需要设置正确的输出(wav writer),然后执行前面描述的"同时播放多个声音"步骤。

  • 改变卷

这要感谢Channel的方法(setVolume)。

  • 播放/混音

前面描述的解决方案是正确的吗?

  • 播放/混合多个声音:不要同时启动所有声音

正如你在这个多音轨屏幕上看到的,我们可以有多个声音,它们可以在不同的时间开始。例如,我如何在文件A开始6秒后开始播放文件B(文件A也会继续播放)?是函数Channel->setDelay吗?它是如何工作的?(我不确定理解DSP时钟值…)。

  • 选择一个提取(起始结束点-在XX:XX和YY:YY之间)

我不确定这一点,也许我们可以使用通道:setPosition和/或通道->setDelay ?但是,它是如何工作的呢?(我不确定理解位置值和DSP时钟值的延迟…)。

  • 剪切/复制/粘贴
在这里,我真的不知道我该怎么做。
  • Qt和音频文件

你同意我不能用Qt来做所有这些操作吗?

我希望我讲清楚了。如果你不明白一个问题,不要犹豫。

我不熟悉Qt,我的经验是Java。即便如此,我还是可以提供一些想法。至于混合音频,以及处理多种格式,我认为最好的方法是计划将所有声音文件转换为选定帧率的PCM值(范围从-1到1)。值可以是浮点数或双精度数。(我实际上在我的Java混频器中使用了int,尽管short对于16位编码已经足够了。)

然后,在数字上添加每个轨道的相应(及时)值进行混合或进行其他形式的操作并不那么困难。然后将结果转换回您用于播放的特定格式,例如,"CD质量"的16位44100 fpm立体声。对所有数据使用单一格式还有助于制作图形界面工具和显示。

此条目旨在为您的解决方案做出贡献,而不是对您的问题的完整解决方案。