当数据包排队延迟时,IOS AudioQueue不播放
我有一个将数据包排队到AudioQueue的应用程序,它工作得非常好。问题是当我在网络中有延迟时,我不能及时向音频队列提供数据包 所有应用程序都运行良好,enqueueBuffer不会返回任何错误,但AudioQueue正在丢弃数据包(因此我没有声音),因为它们太旧了 我是否可以强制AudioQueue播放这些音频数据包?或者至少知道这些数据包正在被丢弃?。因为如果我知道,我可以暂停播放来重新启动队列。。。(不是很好的解决方案,但我没有更好的解决方案) 因为延迟可能非常大,我不能使用大的缓冲区,因为这将最小化错误,但不能解决它当数据包排队延迟时,IOS AudioQueue不播放,ios,audioqueue,Ios,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:
检索该时间线),该时间线即使在没有播放任何数据包的情况下也会继续前进。当使用比当前时间早的数据包将缓冲区排队时,这些数据包将被丢弃。暂停队列也会暂停时间线,因此如果在数据包用完之前暂停,然后在收到延迟的数据包后恢复播放,这些数据包将不会被视为旧数据包,并将正确播放。