当数据包排队延迟时,IOS AudioQueue不播放

当数据包排队延迟时,IOS AudioQueue不播放,ios,audioqueue,Ios,Audioqueue,我有一个将数据包排队到AudioQueue的应用程序,它工作得非常好。问题是当我在网络中有延迟时,我不能及时向音频队列提供数据包 所有应用程序都运行良好,enqueueBuffer不会返回任何错误,但AudioQueue正在丢弃数据包(因此我没有声音),因为它们太旧了 我是否可以强制AudioQueue播放这些音频数据包?或者至少知道这些数据包正在被丢弃?。因为如果我知道,我可以暂停播放来重新启动队列。。。(不是很好的解决方案,但我没有更好的解决方案) 因为延迟可能非常大,我不能使用大的缓冲区,

我有一个将数据包排队到AudioQueue的应用程序,它工作得非常好。问题是当我在网络中有延迟时,我不能及时向音频队列提供数据包

所有应用程序都运行良好,enqueueBuffer不会返回任何错误,但AudioQueue正在丢弃数据包(因此我没有声音),因为它们太旧了

我是否可以强制AudioQueue播放这些音频数据包?或者至少知道这些数据包正在被丢弃?。因为如果我知道,我可以暂停播放来重新启动队列。。。(不是很好的解决方案,但我没有更好的解决方案)

因为延迟可能非常大,我不能使用大的缓冲区,因为这将最小化错误,但不能解决它


非常感谢你

你走对了方向。您可以通过在到达网络缓冲区末尾时在回调过程中检测,然后暂停音频队列来处理网络延迟。稍后,在缓冲足够的数据包后重新启动队列。您的代码如下所示

if playerState.packetsRead == playerState.packetsWritten {
    playerState.isPlaying = false
    AudioQueuePause(aq)
}
在你的网络代码中

if (playerState.packetsWritten >= playerState.packetsRead + kNumPacketsToBuffer) {
    if !playerState.isPlaying {
        playerState.isPlaying = true

        for buffer in playerState.buffers {
            audioCallback(playerState, aq: playerState.queue, buffer: buffer)
        }

        AudioQueueStart(playerState.queue, nil)
    }
}

您还需要更新代码,以便每次从网络接收数据包时,
playerState.packetswrited
都会递增,同样,在将数据包添加到音频队列时,
playerState.packetsRead
也会递增。
kNumPacketsToBuffer
的最佳数量取决于编解码器和网络条件。我建议AAC使用256,并根据性能向上/向下调整。

非常感谢。这是非常有用的信息。如果我可以强制播放所有数据包(而不丢弃数据包),那就太好了。但至少,这是个好主意。暂停队列不会导致数据包被丢弃。音频队列维护一个内部时间线(您可以使用
AudioQueueGetCurrentTime:
检索该时间线),该时间线即使在没有播放任何数据包的情况下也会继续前进。当使用比当前时间早的数据包将缓冲区排队时,这些数据包将被丢弃。暂停队列也会暂停时间线,因此如果在数据包用完之前暂停,然后在收到延迟的数据包后恢复播放,这些数据包将不会被视为旧数据包,并将正确播放。