2016-11-22 83 views
2

我想開發應用程序什麼播放從服務器流PCM數據。如何在iOS中從服務器播放流式PCM數據?

我已經使用AudioQueue,但它不能很好地工作。 (從服務器)

PCM數據格式:

Sample rate = 48000, num of channel = 2, Bit per sample = 16 

並且,服務器不流固定字節客戶端。

(流式可變字節例:30848,128,2764,...字節)

我的源代碼:

這裏,ASBD結構是什麼我已經設置好的&創建音頻隊列對象 (語言:SWIFT)

// Create ASBD structure & set properties. 
var streamFormat = AudioStreamBasicDescription() 

streamFormat.mSampleRate = 48000 
streamFormat.mFormatID = kAudioFormatLinearPCM 
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked 
streamFormat.mFramesPerPacket = 1 
streamFormat.mChannelsPerFrame = 2 
streamFormat.mBitsPerChannel = 16 

streamFormat.mBytesPerFrame = (streamFormat.mBitsPerChannel/8) * streamFormat.mChannelsPerFrame 
streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame 
streamFormat.mReserved = 0 

// Create AudioQueue for playing PCM streaming data. 
var err = AudioQueueNewOutput(&streamFormat, self.queueCallbackProc, nil, nil, nil, 0, &aq) 

... 

我已經設置好的ASBD結構&創建AudioQueue對象像上面。

AudioQueue播放流PCM數據非常好幾秒,

但很快播放聲音開啓和關閉。我能做什麼?

(仍然流,並排隊AudioQueue)

請給我任何的想法。

+0

低帶寬格式的工作? –

+0

請原諒?我不知道你說的很好。 – user6081283

+0

當你嘗試傳輸像mp3這樣更緊湊的格式時它會工作嗎? –

回答

5

你需要做的(至少)兩兩件事:

您需要緩衝數據的處理時延抖動和從服務器之間的數據不同的數據包大小,以及音頻隊列回調請求數據。一個典型的解決方案是使用一個預先填充了一定數據量的循環FIFO /緩衝區,足以處理更糟糕的網絡抖動(您需要統計分析這個數字)。音頻隊列回調可以將請求的數據量從循環FIFO中複製出來。網絡代碼試圖保持填充。

您可能還需要一些方法來在兩種比率不夠相同時隱藏錯誤:例如,某種方式在網絡速率太慢時複製或合成額外的聲音,以及在網絡速率過高時以某種方式排除樣本,這兩種方式都儘可能地聽不到任何速率不連貫或不產生大聲的點擊,或者網絡中斷。

+0

第二部分僅適用於實時流。否則,客戶端可以控制從服務器讀取數據的速度,並使其適應播放速度。 – Codo

+0

即使是一個非實時流也會受到瞬時網絡中斷(擁塞,丟失的數據包太多等)的影響。 – hotpaw2

+0

我部分同意。如果你有緩存(而且這是必需的),只留下長時間的暫時網絡丟失。您將無法用重複或合成的聲音填充它們。但我同意需要以某種方式避免大聲點擊。 – Codo

相關問題