【问题标题】:Manipulate audio file with FMOD使用 FMOD 处理音频文件
【发布时间】:2014-04-23 09:31:00
【问题描述】:

根据我之前的问题的cmets,我太宽泛了。所以,我会试着问一些具体的问题。

上下文

我想用C++开发一个非常简单的软件“Audacity”;换句话说,一种用于处理具有图形用户界面的音频文件的软件。例如,我想选择声音 A 的提取(起点 - 在 XX:XX 和 YY:YY 之间),然后剪切/复制它,然后粘贴到另一个声音 B(在 ZZ:ZZ),混合两个或更多声音等。

我发现了什么

如有错误请随时纠正我。

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

我不确切知道音频文件的工作原理,并且由于多种格式、比特率、声音混合,操作它们也可能很复杂......所以,我搜索了一个库以方便操作,我发现FMOD Ex API。

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

  • 麦克风录音

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

  • 在扬声器上播放歌曲

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

  • 同时播放多个声音

我已经看到它可以通过多个 Channel 来完成:我们首先初始化一个具有多个通道的 System object,然后,我们可以播放多个音乐:对于每个通道,我们调用 System::createSound,然后调用 System::播放声音。我们还需要使用 System::update 进行更新。

  • 保存声音

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

  • 保存多种声音的混合

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

  • 改变音量

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

问题

  • 播放/混合多种声音

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

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

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

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

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

  • 剪切/复制/粘贴

在这里,我真的不知道我该怎么做。

  • Qt 和音频文件

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

谢谢

我希望我很清楚。如果您不理解问题,请不要犹豫。

【问题讨论】:

    标签: c++ audio fmod


    【解决方案1】:

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

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

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

    【讨论】:

    • 我的目标不是自己动手操作,而是感谢您的建议。尽管如此,这很有趣,我会看看这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多