Swift AKAudioPlayer节点在到达文件/缓冲区末尾之前停止后是否应用10毫秒淡出?

Swift AKAudioPlayer节点在到达文件/缓冲区末尾之前停止后是否应用10毫秒淡出?,swift,audiokit,Swift,Audiokit,首先,我要感谢AudioKit的团队通过他们的代码揭示了一些困难的问题。我有几个问题 1:如果玩家在到达文件/缓冲区末尾之前停止,AKAudioPlayer类应用的现场淡出效果似乎不会消失。AudioKit库中是否还有其他地方处理此问题 2:有人知道AVAudioMixer节点的音量是否可以实时调整吗?例如,我是否可以每1/441毫秒进行一次调整,以跟随我的衰减包络线曲线?还有AVAudioUnitEQ及其珠藻蛋白特性 3:是否可以在AVAudioPCMBuffer的floatChannelDa

首先,我要感谢AudioKit的团队通过他们的代码揭示了一些困难的问题。我有几个问题

1:如果玩家在到达文件/缓冲区末尾之前停止,AKAudioPlayer类应用的现场淡出效果似乎不会消失。AudioKit库中是否还有其他地方处理此问题

2:有人知道AVAudioMixer节点的音量是否可以实时调整吗?例如,我是否可以每1/441毫秒进行一次调整,以跟随我的衰减包络线曲线?还有AVAudioUnitEQ及其珠藻蛋白特性

3:是否可以在AVAudioPCMBuffer的floatChannelData被调度之后以及播放时写入它

我正在用AVFoundation编写一个采样器应用程序。当要解决对AVAudioPlayerNodes中加载的音频文件应用淡入淡出的问题时,我的第一个计划是实时调整连接到播放器节点的混音器节点的音量。这似乎没有任何效果。这完全有可能是因为我做这件事的时机不对

当我最后查看AKAudioPlayer类时,我意识到可以调整与音频文件关联的实际缓冲区。经过一两天的调试,我能够将AKAudioPlayer类中的代码改编成我的PadModel类,只是有一些细微的差异,而且效果非常好

然而,每当我在文件结束之前停止播放我的一个键盘时,我仍然会收到那些讨厌的小咔哒声,因为我应用的淡入淡出只在文件/缓冲区的开始和结束处

就我的第一个问题而言,在查看AKAudioPlayer类时,似乎只有应用于缓冲区的淡入淡出发生在缓冲区的开始和结束处。stop()方法似乎不会对缓冲区应用任何类型的现场淡入淡出

在我看来,一旦停止事件发生,让淡出发生的唯一方法就是在停止事件发生后应用淡出,对吗

我尝试过这样做,在我调用播放器节点上的stop后,立即播放一个10毫秒长的淡出缓冲区,该缓冲区由stop位置后10毫秒的缓冲区组成。它没有预期的效果。我从一开始就对这个计划没有多大信心,但似乎值得一试

要明确的是,一旦调用了my stop()方法,在实际停止播放器节点之前,我会分配10毫秒的淡入淡出缓冲区,在它当前所在的位置读入缓冲区,因为淡入淡出缓冲区包含的帧数。然后,我将信封应用于最近分配的淡出缓冲区,就像在AKAudioPlayer类的fadeBuffer()方法中所做的那样。此时,我最终在播放节点上调用stop(),然后安排并播放淡出缓冲区

显然,在停止缓冲区和播放淡出缓冲区之间会有一个不连续性,例如,当我将淡出应用到淡出缓冲区时,我分配给局部变量的停止帧位置将不再有效,等等。事实上,一旦我放开一个键盘,播放的声音只能被描述为不连续的

对于这个问题,我能想到的唯一其他解决方案是一项艰巨的任务,那就是在播放缓冲区时,在当前播放位置之前,持续实时地对样本应用淡入淡出封套。我目前不相信我有足够的编码能力来完成这个任务

无论如何,我看了所有关于S.O.的关于AudioKit的问题,这个特定的主题似乎没有提到。因此,任何对此事有想法的人都将不胜感激。提前谢谢

如果有人想查看我的代码,PadModel类从该文件的第223行开始:


AudioKit缺少一种从淡入淡出到停止的方法。我建议请求该功能,因为这是值得努力的。如果您使用的是AVAudioUnitSampler,我相信您可以设置ADSR值以实现衰减效果,但不是以非常简单的方式。您必须使用AULab创建一个预设,找出如何使发布生效,然后将其导入到您的项目中。

谢谢!我要在没有AVAudioUnitSampler的情况下尝试一下。时间和线程将是粗糙的,以获得正确的。假设在播放缓冲区时可以写入floatChannelData缓冲区,这应该是可以实现的。确实可以在播放AVAudioPCM缓冲区时将其写入。我仍然不知道第二个问题的答案。虽然在我的采样器应用程序中,我设置了一个响应速度非常快的音量控制。因此,如果你能把握好时机,也许通过AVAudioMixer节点的卷应用淡入淡出实际上可能会起作用。我目前在当前播放位置之前应用淡入淡出的解决方案不起作用,因为我还没有弄清楚如何以足够快的速度应用淡入淡出,以跟上缓冲区的当前播放位置。我将重新讨论这一点。我能够通过在连接的混音器节点上使用定时器来调低音量,从而在我一润色时就获得部分令人满意的结果。不幸的是,结束点击并没有完全消除。据我所知,即使您在混音器节点上将音量一直调低,当您在播放器节点上调用stop()时,也可能会听到或不会听到咔嗒声。我现在听到的停止咔哒声大大减少了,但并没有完全消除。在某个时候,我将尝试使用EQ节点。