Id想要知道持续时间倍数的AKPlayer
是否支持同步循环?
似乎不受支持,或者如果不是故意的,那是一个错误?在这里找到了类似的报告(How to use the loop if the track was not started from the beginning (with buffering type = .always in AKPlayer )),我以为我正在提供解决方案,但是经过大量测试后发现提供的解决方案也不起作用。请参阅附件(*)
我计划记录一些持续时间等于或小于最小loop
倍数的循环。首先,发现在同一.play
起点尝试启动多个AKPlayer
的AVAudioTime
时,同步失败。经过几次尝试后,坚持使用缓冲.always
进行了修复,其中包括.prepare
方法。所以,希望这不会妨碍...
问题是我希望同步听一堆loops
的演奏,即使有些持续时间长2倍或4倍...
因此,在期望满足主要需求的情况下可以进行循环工作:
- Loop1 of duration 2.5 [looping]
- Loop2 of duration 2.5 [looping]
- Loop3 of duration 5 [looping]
[Loop3
表现不好,后半部分重复几次,假设是4/4,看着节拍数字,我们会听到以下声音:
- Loop1: 1 2 3 4, 1 2 3 4, 1 2 3 4, 1 2 3 4
- Loop2: 1 2 3 4, 1 2 3 4, 1 2 3 4, 1 2 3 4
- Loop3: 1 2 3 4 5 6 7 8, 5 6 7 8, 5 6 7 8
这会失败吗?持续时间是倍数的独立播放器的loop
是否受支持?
经过更多测试后,我发现添加第三首曲目后会发生这种情况。例如:
- Loop1: 1 2 3 4
- Loop2: 1 2 3 4 5 6 7 8
到目前为止似乎工作正常,但现在我添加了一条新轨道:
我听到的是:
我尝试使用AKClipRecorder,但发现我需要在记录时间之前声明长度,这违反了主要要求:)
(*)音频文件暴露了这个问题,该测试使用AKWaveTable
完成,但似乎是相同的问题。我将研究重写一些易于共享的代码,以查看它是否与我的实现有关,但是,我在顶部共享了链接,其他人也遇到了同样的问题。
https://drive.google.com/open?id=1zxIJgFFvTwGsve11RFpc-_Z94gEEzql7
我相信我遇到了问题,这与为较新的循环安排播放开始时间有关。
[之前,我录制了一个循环,然后在currentTime
处播放,这是主播放器的值。从我的角度来看,这是关于startTime
保持其状态的player
,鉴于从内存中读取的状态,该状态是不可变的。对于或多或少的主循环端点,这总是正确的,它是记录的循环的中点,恰好是主循环的两倍或另一倍。]
为了解决这个问题,我对播放器项目的安排不同,如下:
player.startTime = 0 player.endTime = audioFile.duration let offsetCurrentime = ((beatLength * 4.0) - currentTime) player.play(at: AVAudioTime.now() + offsetCurrentime)
.startTime
定义循环起点的开始,我也将持续时间长度声明为.endTime
;最后,我计算出了主控bar
或用作参考(或弯针时钟)的主控环路的长度,然后将其传递给play
方法。意味着我正在计划将其播放到startTime
,而不是从currentTime
播放,因为那样会引起问题,如我之前所公开的!
总而言之,使用方法at
的属性.play
安排从starting point
开始而不是从循环播放的当前时间开始的时间。