簡體   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