2010-03-15 39 views
2

我正在編寫一個iPhone應用程序,需要從內置麥克風錄製音頻,然後將該音頻數據發送到服務器進行處理。在iPhone上錄製音頻並使用NSOutputStream發送網絡

應用程序使用套接字連接來連接服務器和音頻隊列服務來進行錄製。我不確定的是何時實際發送數據。音頻隊列服務在每次用一些音頻數據填充緩衝區時觸發回叫。 NSOutputStream每次有可用空間時觸發一個事件。

我的第一個想法是將數據發送到服務器上的音頻隊列回調。但是,如果NSOutputStream當時沒有可用空間,它似乎會遇到問題。

然後我考慮緩衝從音頻隊列返回的數據,並在每次NSOutputStream觸發可用空間事件時發送一些數據。但是,如果發送到服務器領先於音頻記錄,則這似乎有問題,那麼將會出現空間可用事件沒有任何內容可寫的情況,因此事件不會再次被觸發,數據傳輸將有效地停滯。

那麼處理這個問題的最好方法是什麼?我是否應該有一個重複觸發的計時器,看看是否有可用空間,並且有數據需要發送?另外,我認爲我需要進行一些線程同步,以便我可以從我的緩衝區中將大量數據發送到網絡中,但是隨着記錄的進行,將數據塊添加到緩衝區,而不會冒着損壞緩衝區的風險。

回答

3

如果緩衝區超過特定大小,您可以使用環形緩衝區來保存特定數量的音頻幀並丟棄幀。當你的stream-has-space-available回調被調用時,將一個幀從環形緩衝區中取出併發送。

CHDataStructures提供了一些環緩衝區(它稱之爲「循環緩衝區」)類。

+0

感謝Peter,我之前沒有遇到過這些數據結構。看起來這可能是有用的,雖然我在服務器端進行語音識別,所以我不知道我可以在不影響準確性的情況下安全丟棄幀。你知道objective-c的線程安全隊列結構嗎?我一直在環顧四周,沒有找到任何東西。也許我必須寫我自己的。 – 2010-03-15 17:26:59

+0

我不知道關於我鏈接到的框架中的類的線程安全性。你應該閱讀它的文檔,看看它說什麼。 – 2010-03-15 17:30:13

+0

@PeterHosey你能解釋我如何將數據從回調函數發送到服務器嗎?我無法理解如何在該回調函數中編寫obj-c代碼以從緩衝區提取音頻數據並將其發送到服務器 – 2012-03-15 10:05:13