首先,我要感谢AudioKit团队通过他们的代码了解一些难题。我有几个问题。
1:如果播放器在到达文件/缓冲区末尾之前停止,则AKAudioPlayer类不会出现现场淡入淡出。 AudioKit库中还有另一个地方可以处理吗?
2:有人知道AVAudioMixer节点的音量是否可以实时调整?例如。我可以每1/441 ms进行一次调整,以跟随淡入淡出信封的曲线吗?还有AVAudioUnitEQ及其globalGain属性。
3:在调度AVAudioPCMBuffer的floatChannelData后,是否可以在播放时写入?
我正在用AVFoundation编写一个采样器应用程序。当解决在AVAudioPlayerNodes中对加载的音频文件应用淡入淡出的问题时,我的第一个计划是实时调整连接到我的播放器节点的混音器节点的音量。这似乎没有任何影响。这样做完全可能是我的时机关闭了。
当我最终查看AKAudioPlayer类时,我意识到可以调整与音频文件关联的实际缓冲区。经过一两天的调试,我能够将AKAudioPlayer类中的代码调整到我的PadModel类中,只有一些细微的差别,而且效果很好。
然而,每当我在文件结束前停止播放我的Pads之一时,我仍然会收到那些令人讨厌的小点击,因为我应用的淡入淡出仅在文件/缓冲区的开头和结尾处。
就我的第一个问题而言,在查看AKAudioPlayer类时,似乎应用于缓冲区的唯一淡入量发生在缓冲区的开头和结尾。 stop()方法似乎不会对缓冲区应用任何类型的现场淡入淡出。
在我看来,一旦发生停止事件,发生淡出的唯一方法就是在停止事件发生后应用它,对吗?
我试过这样做,在我在播放器节点上调用stop后立即播放一个10 ms长的淡出缓冲区,该缓冲区由停止位置后10 ms的缓冲区组成。它没有所需的效果。从一开始我对这个计划没有多少信心,但似乎值得一试。
要清楚,一旦我的stop()方法被调用,在实际停止播放器节点之前,我分配10 ms的淡入淡出缓冲区,读入当前位置的缓冲区,为我的帧数淡入缓冲区由。然后我将信封应用于最近分配的淡出缓冲区,就像在AKAudioPlayer类中的fadeBuffer()方法中一样。此时我终于在播放节点上调用stop(),然后安排并播放淡出缓冲区。
显然,在停止缓冲区和播放淡出缓冲区之间会出现不连续性,例如:当我将淡入淡出应用到淡出缓冲区时,分配给局部变量的停止帧位置将不再有效等等。实际上,一旦我松开一个打击垫,播放的声音只能被描述不连续的。
我能想到的问题的唯一其他解决方案让我觉得这是一项令人生畏的任务,它将在播放缓冲区时,将当前播放位置之前的样本实时连续应用到渐变信封。我目前不相信我有编码方法可以解决这个问题。
无论如何,我查看了S.O.的所有问题。关注AudioKit,这个特定主题似乎没有出现。因此,任何人都会对此事的想法表示赞赏。提前谢谢!
如果有人想看我的代码,PadModel类从这个文件的第223行开始:
答案 0 :(得分:1)
AudioKit缺少一种淡入淡出的方法。我建议请求这个功能,因为这是值得努力的。如果您正在使用AVAudioUnitSampler,我相信您可以设置ADSR值以实现淡入淡出效果,但不能以非常简单的方式。您必须使用AULab创建预设,找出如何使发布工作,然后将其导入您的项目。