操纵音频文件与FMOD
Manipulate audio file with FMOD
根据我上一个问题的评论,我太宽泛了。所以,我会尽量问一些具体的问题。
<<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立体声。对所有数据使用单一格式还有助于制作图形界面工具和显示。
此条目旨在为您的解决方案做出贡献,而不是对您的问题的完整解决方案。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 在FMOD中改变MIDI或WAV/MP3文件的速度
- 操纵音频文件与FMOD