IOS 入队数据包延迟时,AudioQueue 不播放
IOS AudioQueue doesnt play when enqueue packets late
我有一个将数据包排队到 AudioQueue 的应用程序,它运行良好。问题是当我的网络出现延迟时,我无法及时将数据包提供给 AudioQueue。
所有应用程序都运行良好并且 enqueueBuffer 没有 return 任何错误,但是 AudioQueue 正在丢弃数据包(所以我没有声音),因为它们太旧了。
我可以强制 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.packetsWritten
都会递增,同样地,当您将数据包添加到音频队列时 playerState.packetsRead
. kNumPacketsToBuffer
的最佳数量取决于编解码器和网络条件。我建议对 AAC 使用 256 并根据性能调整 up/down。
我有一个将数据包排队到 AudioQueue 的应用程序,它运行良好。问题是当我的网络出现延迟时,我无法及时将数据包提供给 AudioQueue。
所有应用程序都运行良好并且 enqueueBuffer 没有 return 任何错误,但是 AudioQueue 正在丢弃数据包(所以我没有声音),因为它们太旧了。
我可以强制 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.packetsWritten
都会递增,同样地,当您将数据包添加到音频队列时 playerState.packetsRead
. kNumPacketsToBuffer
的最佳数量取决于编解码器和网络条件。我建议对 AAC 使用 256 并根据性能调整 up/down。