我正在編寫一個iPhone應用程序,需要從內置麥克風錄製音頻,然後將該音頻數據發送到服務器進行處理。在iPhone上錄製音頻並使用NSOutputStream發送網絡
應用程序使用套接字連接來連接服務器和音頻隊列服務來進行錄製。我不確定的是何時實際發送數據。音頻隊列服務在每次用一些音頻數據填充緩衝區時觸發回叫。 NSOutputStream每次有可用空間時觸發一個事件。
我的第一個想法是將數據發送到服務器上的音頻隊列回調。但是,如果NSOutputStream當時沒有可用空間,它似乎會遇到問題。
然後我考慮緩衝從音頻隊列返回的數據,並在每次NSOutputStream觸發可用空間事件時發送一些數據。但是,如果發送到服務器領先於音頻記錄,則這似乎有問題,那麼將會出現空間可用事件沒有任何內容可寫的情況,因此事件不會再次被觸發,數據傳輸將有效地停滯。
那麼處理這個問題的最好方法是什麼?我是否應該有一個重複觸發的計時器,看看是否有可用空間,並且有數據需要發送?另外,我認爲我需要進行一些線程同步,以便我可以從我的緩衝區中將大量數據發送到網絡中,但是隨着記錄的進行,將數據塊添加到緩衝區,而不會冒着損壞緩衝區的風險。
感謝Peter,我之前沒有遇到過這些數據結構。看起來這可能是有用的,雖然我在服務器端進行語音識別,所以我不知道我可以在不影響準確性的情況下安全丟棄幀。你知道objective-c的線程安全隊列結構嗎?我一直在環顧四周,沒有找到任何東西。也許我必須寫我自己的。 – 2010-03-15 17:26:59
我不知道關於我鏈接到的框架中的類的線程安全性。你應該閱讀它的文檔,看看它說什麼。 – 2010-03-15 17:30:13
@PeterHosey你能解釋我如何將數據從回調函數發送到服務器嗎?我無法理解如何在該回調函數中編寫obj-c代碼以從緩衝區提取音頻數據並將其發送到服務器 – 2012-03-15 10:05:13