用FMOD操纵音频文件

时间:2014-03-17 22:36:52

标签: c++ audio fmod

根据上一个问题的评论,我太宽泛了。所以,我会尝试询问具体问题。

上下文

我想用C ++开发一个非常简单的软件版本" Audacity&#34 ;;换言之,用于通过图形用户界面操纵音频文件的软件。例如,我想选择一个声音A的提取(起点 - 在XX:XX和YY:YY之间)然后剪切/复制它然后粘贴另一个声音B(在ZZ:ZZ),混合两个或更多声音等。

我发现的内容

如果有问题,请不要犹豫纠正我。

首先,我想我会使用Qt来制作图形用户界面。我已经看到Qt也可以管理音频文件,但我觉得它无法真正操纵它们(剪切/粘贴,混合......)。

我不确切知道音频文件是如何工作的,并且由于多种格式,比特率,声音混合,操纵它们也很复杂...所以,我已经搜索了一个库来促进操作和我找到了FMOD Ex API。

然后,我已经阅读了安装中包含的文档,并且我找到了一些答案......以及一些问题。

  • 从麦克风录制

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

  • 在演讲者上播放歌曲

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

  • 同时播放多个声音

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

进行更新
  • 保存声音

与播放歌曲的方式相同:System :: playSound。 我们之前必须使用System :: setOutput(FMOD_OUTPUTTYPE_WAVWRITER)更改输出。

  • 保存多种声音混合

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

  • 更改音量

这要归功于Channel的方法(setVolume)。

问题

  • 播放/混合多个声音

之前描述的解决方案是否正确?

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

正如你在multitracks screen看到的那样,我们可以有多个声音,它们可以在不同的时间开始。例如,如何在文件A(也继续播放)开始后六秒钟开始播放文件B?它是函数Channel-> setDelay?这个怎么运作 ? (我不确定理解DSP时钟值......)。

  • 选择摘录(起点 - XX:XX和YY:YY之间)

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

  • 剪切/复制/粘贴

在这里,我真的不知道如何做到这一点。

  • Qt和音频文件

你是否同意我不能使用Qt进行所有这些操作?

感谢

我希望我能说清楚。如果你不理解问题,请不要犹豫。

1 个答案:

答案 0 :(得分:0)

我不熟悉Qt。我的经验是Java。即便如此,我也许能够提出一些想法。就混音音频而言,处理多种格式时,我认为最好的方法是计划将所有贡献的声音文件转换为所选帧速率的PCM值(范围从-1到1)。值可以是浮点数或双精度数。 (我实际上在我的Java混音器中使用了int,尽管短路就足以进行16位编码。)

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

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