2011-12-09 31 views
5

我想从一个iPhone传输语音到另一个。我使用TCP建立了两个iPhone之间的连接,并且我已经设法在iPhone上录制语音并使用音频队列服务播放它。我也设法在两款iPhone之间发送数据。我通过发送NSData包来做到这一点。使用音频队列服务记录到数据的音频

我的下一步是在录音时将音频数据发送给其他iPhone。我相信我应该在AudioInputCallback中这样做。我的AudioQueueBufferRef被称为inBuffer,似乎我想将inBuffer->mAudioData转换为NSData,然后将NSData发送到其他设备,然后将其解压缩。

有谁知道这是否会做到这一点,以及如何将我的inBuffer->mAudioData转换为NSData?其他方法也是受欢迎的。

这是我的回调方法中,我相信我应该“抢”的数据并将其发送给其他iPhone:

void AudioInputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumberPacketDescriptions, const AudioStreamPacketDescription *inPacketDescs) 
{ 
    RecordState *recordState = (RecordState *)inUserData; 
    if(!recordState->recording) 
     return; 

    OSStatus status = AudioFileWritePackets(recordState->audioFile, 
              false, 
              inBuffer->mAudioDataByteSize, 
              inPacketDescs, 
              recordState->currentPacket, 
              &inNumberPacketDescriptions, 
              inBuffer->mAudioData); 
    if(status == 0) 
    { 
     recordState->currentPacket += inNumberPacketDescriptions; 
    } 

    AudioQueueEnqueueBuffer(recordState->queue, inBuffer, 0, NULL); 
} 

回答

2

你可能要考虑保存音频数据(你的例子显示了音频采样指针和字节计数)从音频回调到另一个队列或FIFO,然后有一个单独的网络线程从音频字节创建NSData并发送它。

+0

谢谢你的回答。我不知道为什么我应该使用另一个队列。你能详细说明一下吗?你不会碰巧有一些示例代码将数据转换为NSData? – simonbs

+0

在http://stackoverflow.com/a/8486682/486845上查看hotpaw2的答案 – simonbs