2013-03-31 54 views
1

我想通過NSSocket在iPhone中實時傳輸麥克風中的某些錄音。從AudioUnit編碼錄製通過iOS中的NSOutputStream發送

我有記錄和回放的回調。我嘗試使用下面的代碼從緩衝區直接讀取:當我試圖

SInt16 *intFromBuffer; 
intFromBuffer = audioBufferList->mBuffers[0].mData; 

NSLog(@"0x%X", intFromBuffer); 

我得到例如:0xA182E00

而且現在的重要組成部分 - 回放回撥:

static OSStatus playbackCallback(void *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp *inTimeStamp, 
          UInt32 inBusNumber, 
          UInt32 inNumberFrames, 
          AudioBufferList *ioData) { 

/** 
This is the reference to the object who owns the callback. 
*/ 
AudioProcessor *audioProcessor = (__bridge AudioProcessor*) inRefCon; 

// iterate over incoming stream an copy to output stream 
for (int i=0; i < ioData->mNumberBuffers; i++) { 
    AudioBuffer buffer = ioData->mBuffers[i]; 

    // find minimum size 
    UInt32 size = min(buffer.mDataByteSize, [audioProcessor audioBuffer].mDataByteSize); 

    intFromBuffer = (SInt16)([NSString stringWithFormat:@"0x%@", data.output]); 

    memcpy(buffer.mData, intFromBuffer, size); //this works fine! 
} 
return noErr; 
} 

但現在 - 我如何讓這個intFromBuffer在NSStream上工作?

當我嘗試直接發送它作爲NSString並將其作爲NSString發回並解析回到SInt16時,我所得到的只是噪音。

任何想法?我用盡想法...

+0

你在做什麼不會奏效 - 你正在接受一個NSString *指針並用SInt16覆蓋它的內存。你甚至不確定NSString *是否爲你的數據分配了足夠的內存。這不是正確的方法。你有沒有看看[NSData](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html)類? – Mar0ux

+0

謝謝,它幫助了很多。我會解碼數據時遇到問題。我的服務器用類似這樣的方式接收數據:<12345678 12345678 ...>具有適當的值和東西的Ofcourse。它發回它到我的應用程序,我試圖將此字符串轉換爲NSData,但它所得到的仍然是噪聲。 –

+0

一般來說 - 我需要將傳入的字符串,實際上是以前發送的NSData,NSData,沒有任何實際流的變化。 –

回答

0

好吧,我想通了。

該問題與字符串編碼有關。我的服務器正在發送UTF8編碼的文本,但我的代碼試圖用ASCII來解釋它,這導致了問題。

我在代碼中發現的另一個問題是錯誤的數據類型。我把它作爲NSMutableData發送,但是當我收到它時,我將數據以錯誤的方式轉換回NSMutableData,所以我的AudioProcessor無法訪問實際數據,它似乎編譯爲NSString對象,並且它一直在拋出異常從字節創建框架:

SInt16 *frames = (SInt16 *)[data.input bytes]; 

最後一個問題,我有我的代碼實際上是非常有損傳歷程,所以當數據來自服務器返回的質量非常差,但我相信它的緩衝區大小相關的問題。我想我很快就會明白的。

非常感謝StackOverflow社區。我在這裏是新人,但我看到你是一個很大的幫助,即使有簡單的評論,有助於指導正確的方向。

再次感謝。

+0

再次 - 問題不是緩衝區,而是編碼錯誤。在我的代碼中,我嘗試將數據解釋爲UTF8字符串,並將數據解釋爲UTF8字符串,它改變了我的傳入數據。我的應用程序現在工作得很好,都在模擬器和手機上。 –

相關問題