1

我正在尝试通过 NSSocket 从我的 iPhone 中的麦克风实时流式传输一些录音。

我有录音和播放的回调。我正在尝试使用以下代码直接从缓冲区中读取:

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 时,我得到的只是噪音。

有任何想法吗?我的想法不多了...

4

1 回答 1

0

好的,伙计们,我想通了。

问题与字符串编码有关。我的服务器正在发送 UTF8 编码的文本,但我的代码试图用 ASCII 解释它,这导致了问题。

我在代码中发现的另一个问题也是错误的数据类型。我将它作为 NSMutableData 发送,但是当我收到它时,我以错误的方式将数据转换回 NSMutableData,因此我的 AudioProcessor 无法访问编译器认为是 NSString 对象的实际数据,并且它一直在抛出异常从字节创建帧:

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

我的代码遇到的最后一个问题实际上是非常有损的传输,所以当数据从服务器返回时质量很差,但我相信这是与缓冲区大小相关的问题。我想我很快就会弄清楚的。

非常感谢 StackOverflow 社区。我是新来的,但我看到你是一个很大的帮助,即使是简单的评论也有助于朝着正确的方向前进。

再次感谢。

于 2013-04-01T01:05:33.787 回答