使用音频队列服务将数据录制到数据

时间:2011-12-09 20:03:58

标签: iphone audio nsdata recording audioqueueservices

我想将语音从一个iPhone传输到另一个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);
}

1 个答案:

答案 0 :(得分:2)

您可能需要考虑将音频数据(您的示例显示音频样本指针和字节数)从音频回调保存到另一个队列或FIFO,然后使用单独的网络线程从音频字节创建NSData并发送它