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。