【问题标题】:Synchronizing multiple AKPlayers同步多个 AKPlayer
【发布时间】:2018-02-23 21:44:01
【问题描述】:

我已经为此苦苦挣扎了一段时间。我有一系列 AKPlayers。

var players = [AKPlayer]()

我在网上搜索了很多关于同一问题的其他问题,他们都建议使用:AKPlayer.play(atTime: AVAudioTime)

我已经尝试过这样做(以及其他类似的尝试):

    var sampleRate = selectedSong!.channels[0].audioFile!.sampleRate
    var sampleTime = players[0].audioTime(at: players[0].currentTime)?.sampleTime
    var startTime = AVAudioTime(sampleTime: sampleTime! + Int64(0.25*sampleRate), atRate: sampleRate)

    for audioPlayer in players {
        audioPlayer.play(at: startTime)
    }

和其他类似的东西:

 for audioPlayer in players {
     audioPlayer.play(when: 0, hostTime: mach_absolute_time())
 }

但他们都没有工作。播放时间之间存在明显差异。 (AudioFiles 的长度相同,格式相同)。

如果有帮助,我的设置如下:

AKPlayer -> AKPitchShifter 
                            > AKMixer > AudioKit.output
                  AKPlayer       

** 以上所有AKPlayers 都附加到players 数组中。

这可能是因为我对 AVAudioTime 是什么以及它是如何工作的缺乏了解。

提前致谢。

******* 注释 ****** docs 对 AKPlayer 说

玩家可以被锁定到一个共同的 在各种播放功能中使用 hostTime 来播放时钟和视频

但没有提供同步到 hostTime 的示例。

【问题讨论】:

    标签: swift xcode audiokit


    【解决方案1】:

    你在正确的轨道上。您只需要获取当前时间,而不是使用仅对已经播放的播放器有用的 audioTime(at:) 来检索它。

    // .now() is a convenience extension and AVAudioTime + Double is overloaded.
    var startTime = AVAudioTime.now() + 0.25 
    

    如果任意 0.25 缓冲区没有削减它,请尝试在调用 player.prepare() 之前循环播放您的播放器,然后再获取 now() 以安排开始。

    【讨论】:

    • 您能否更广泛地解释一下您对 .now() 扩展的实现? “AudioTime + Double 过载”的最后一部分让我有些困惑。
    • 没关系。通过一些测试,我发现了它。我已经编辑了您的帖子以包含它,以便将来的人能够找到它。如果有更好的实现,请更改并告诉我。
    【解决方案2】:

    我有同样的问题,我用先生。 Dave234 解决方案第一个播放是同步的,但似乎第二个循环有一点明显的延迟。这是我的代码。

    playerOne.looping = true
    playerTwo.looping = true
    playerThree.looping = true
    playerFour.looping = true
    playerFive.looping = true
    
    let startTime = AVAudioTime.now() + 0.25
    playerOne.play(at: startTime)
    playerTwo.play(at: startTime)
    playerThree.play(at: startTime)
    playerFour.play(at: startTime)
    playerFive.play(at: startTime)
    

    【讨论】:

    • 尝试在获取 startTime 之前对玩家调用 prepare()。
    • 你的意思是schedule(from:,to:,avTime:)? AKAudioPlayers 没有 prepare() 函数
    • AKAudioPlayer 正在被 AKPlayer 替换。
    • 使用 player.buffering = .always 进行无缝循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多