2013-03-31 22 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字符串,它改变了我的传入数据。我的应用程序现在工作得很好,都在模拟器和手机上。 –

相关问题