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