AKPlayer持续时间的倍数是否支持同步循环?

问题描述 投票:0回答:1

Id想要知道持续时间倍数的AKPlayer是否支持同步循环?

似乎不受支持,或者如果不是故意的,那是一个错误?在这里找到了类似的报告(How to use the loop if the track was not started from the beginning (with buffering type = .always in AKPlayer )),我以为我正在提供解决方案,但是经过大量测试后发现提供的解决方案也不起作用。请参阅附件(*)

我计划记录一些持续时间等于或小于最小loop倍数的循环。首先,发现在同一.play起点尝试启动多个AKPlayerAVAudioTime时,同步失败。经过几次尝试后,坚持使用缓冲.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

到目前为止似乎工作正常,但现在我添加了一条新轨道:

  • 循环1:1 2 3 4
  • 循环2:1 2 3 4 5 6 7 8
  • 循环3:1 2 3 4

我听到的是:

  • 循环1:1 2 3 4 1 2 3 4 1 2 3 4
  • 循环2:1 2 3 4 1 2 3 4 5 6 7 8
  • 循环3:1 2 3 4 1 2 3 4 1 2 3 4

我尝试使用AKClipRecorder,但发现我需要在记录时间之前声明长度,这违反了主要要求:)

(*)音频文件暴露了这个问题,该测试使用AKWaveTable完成,但似乎是相同的问题。我将研究重写一些易于共享的代码,以查看它是否与我的实现有关,但是,我在顶部共享了链接,其他人也遇到了同样的问题。

https://drive.google.com/open?id=1zxIJgFFvTwGsve11RFpc-_Z94gEEzql7

audiokit
1个回答
0
投票

我相信我遇到了问题,这与为较新的循环安排播放开始时间有关。

[之前,我录制了一个循环,然后在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开始而不是从循环播放的当前时间开始的时间。

© www.soinside.com 2019 - 2024. All rights reserved.