Ios AVAudioPlayerNode playAt()未同步

Ios AVAudioPlayerNode playAt()未同步,ios,avfoundation,avaudiosession,avaudioengine,avaudioplayernode,Ios,Avfoundation,Avaudiosession,Avaudioengine,Avaudioplayernode,我有一个主要的AVAudioPlayerNode,经常播放。还有其他玩家被放在队列中,当主要玩家到达某一点时进行游戏。 这些AVAudioPlayerNode应同步到毫秒。有时一次可以启动4-10件 它是如何工作的-当需要启动所有计划的播放器时,我将主播放器的lastRenderTime存储在点上,然后使用 player.start(在:lastRenderTime) 通常,它工作正常,声音之间没有任何延迟 但是,我在这个案子上有一些延迟: 在旧设备(iPad2、iPhone5等)上运行 只有当

我有一个主要的AVAudioPlayerNode,经常播放。还有其他玩家被放在队列中,当主要玩家到达某一点时进行游戏。 这些AVAudioPlayerNode应同步到毫秒。有时一次可以启动4-10件

它是如何工作的-当需要启动所有计划的播放器时,我将主播放器的
lastRenderTime
存储在点上,然后使用
player.start(在:lastRenderTime)

通常,它工作正常,声音之间没有任何延迟

但是,我在这个案子上有一些延迟:

  • 在旧设备(iPad2、iPhone5等)上运行
  • 只有当许多播放器在应用程序启动后第一次运行时(例如在iPhone 7上,我在应用程序运行后同时运行8个播放器,我听到声音之间的不同步),但所有播放器都使用相同的
    player.start(在:lastRenderTime)
    时间运行 我使用自定义并发队列异步运行的所有播放器操作

    花3天时间尝试修复此问题。我想听听你的建议

    一些代码: 以下是我如何启动主要玩家-

    self.scheduleBuffer(audioFileBuffer, at: nil, options: [], completionHandler: {
        lastRenderTime = lastRenderTime + audioBufferLength //Schematic showing logic that after each loop I calculate current render time value.
    
        if self.isStopPressed == false { //Run fileEndCompletion only when player seek to end.
            fileEndCompletionHandler() //here is callback that running all scheduled players.
            if loop { // Recursive play this file again.
                self.playAudioBuffer(audioFileBuffer: audioFileBuffer, loop: loop, fileEndCompletionHandler: fileEndCompletionHandler)
            }
        }
    })
    

    运行所有预定播放机的代码示例

    AudioEnginePlayer.sharedInstance.audioQueue.async {
        if !self.isPlaying {
            self.volume = 1.0
            self.audioFile.framePosition = frameCount.startingFrame
            self.prepare(withFrameCount: frameCount.frameCount)
            self.play(at: AudioEnginePlayer.sharedInstance.loopMsLastStartRenderTime) //Calculated lastRenderTime
        }
    
        self.scheduleSegment(self.audioFile, startingFrame: frameCount.startingFrame, frameCount: frameCount.frameCount, at: nil) {
            //WARNING: COMPLETION HANDLER RUNNING EARLY THEN FILE IS COMPLETED
    
            if self.isStopPressed == false { //Run fileEndCompletion only when player seek to end.
                fileEndCompletionHandler()
                if loop {
                    self.playAudioFile(loop: loop, startTime: 0, fileEndCompletionHandler: fileEndCompletionHandler)
                }
            }
        }
    }
    

    lastRenderTime
    不是已经过去了吗?你有一些示例代码来演示这个问题吗?@hyrthyticfistman是的
    lastRenderTime
    总是在过去。它允许所有玩家同步。还添加了一些代码。