2011-12-09 118 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