繁体   English   中英

延迟将数据包入队时,IOS AudioQueue无法播放

[英]IOS AudioQueue doesnt play when enqueue packets late

我有一个可以将数据包排队到AudioQueue的应用程序,并且运行良好。 问题是当网络延迟时,我无法及时将数据包提供给AudioQueue。

所有应用程序都运行良好,enqueueBuffer不会返回任何错误,但是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,并根据性能调整上/下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM