2013-01-21 142 views
5

我從包含編碼PCM緩衝區的套接字接收一系列UDP數據包。解碼完後,我剩下一個int16 *音頻緩衝區,我想立即播放。iOS:從流中播放PCM緩衝區

預期的邏輯是這樣的:

init(){ 
    initTrack(track, output, channels, sample_rate, ...); 
} 

onReceiveBufferFromSocket(NSData data){ 
    //Decode the buffer 
    int16 * buf = handle_data(data); 

    //Play data 
    write_to_track(track, buf, length_of_buf, etc); 
} 

我不知道這一點具有雖然回放緩衝區做的一切。在Android上,我可以通過創建一個AudioTrack對象,通過指定採樣率,格式,通道等來設置它,然後使用緩衝區調用「寫入」方法(就像我希望的那樣我可以在我的僞代碼上面),但在iOS上,我很快就來了。

我嘗試使用音頻文件流服務,但我猜我做錯了,因爲沒有聲音出來,我覺得這些功能本身並沒有實際做任何播放。我也嘗試瞭解音頻隊列服務(我認爲它可能接近我想要的),但是我無法找到任何簡單的代碼示例來了解它的用法。

任何幫助將不勝感激,特別是以示例代碼的形式。

+1

嘿,你設法解決它嗎?我有類似的問題,如果可能的話請發佈你的代碼樣本。 – moenad

回答

4

您需要使用某種類型的緩衝區來保存傳入的UDP數據。 This是我用過的一個簡單而好的循環緩衝區。

然後要從緩衝區播放數據,可以使用音頻單元框架。 Here是一個很好的示例項目。

注意:第一個鏈接還顯示如何使用音頻單元播放。

+0

對於如何去做,我還是有點無知。我有一個來自UDP套接字的接收回調函數。我在那裏獲取PCM幀,所以你要說的是我應該有一個循環緩衝區,這樣函數可以把它提取的幀放到那裏,另一個回調(我不太確定如何做)檢查緩衝區,然後提交使用audiounit服務播放的幀?但是什麼叫第二個回調?看起來好像我無法決定音頻何時播放,這是否正確? –

+0

如果你看看我的第一個鏈接中的例子,有一個叫做audioOutputCallback的函數。它顯示如何將數據從循環緩衝區複製到音頻單元播放。我剛剛製作了上述功能的副本。 – user523234

+0

請分享您的實施部分 –