2012-09-24 46 views
5

我已經被指控將VOIP添加到遊戲中(跨平臺,因此不能使用Apple遊戲包來完成)。ios音頻單元在錄製時的remoteIO回放

現在3或4天,我試圖讓我的頭繞着音頻單元和remoteIO ... 我忽略了幾十個例子,但每次它只應用一個簡單的算法輸入PCM並在揚聲器上播放。 根據Apple的文檔爲了做VOIP我們應該使用kAudioSessionCategory_PlayAndRecord。

UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 

     status = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, 
             sizeof(audioCategory), 
             &audioCategory); 
     XThrowIfError(status, "couldn't set audio category"); 

1),但它似乎(對我)說playAndRecord總是會播放從麥克風什麼未來(或者更excatly的PerformThru回調// aurioTouch),是我錯了嗎?

我有最簡單的回調,做什麼,但AURender

static OSStatus PerformThru(
          void      *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp  *inTimeStamp, 
          UInt32      inBusNumber, 
          UInt32      inNumberFrames, 
          AudioBufferList    *ioData) 
{ 
OSStatus err = AudioUnitRender(THIS->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData); 
    if (err) 
     printf("PerformThru: error %d\n", (int)err); 
    return err 
} 

從該回調,我打算將數據發送到對等(不可直接的過程,但數據將來源於它)...

我沒有看到我可以播放與輸入不同的輸出,除了可能有2個單元,一個錄音,一個播放,但它似乎並不是Apple想要的(仍然歸於文檔)。

當然,我無法找到任何關於它的文檔,音頻單元仍然是相當多的未記錄...

任何人會對什麼是做到這一點的最佳方式的點子?

回答

8

我還沒有使用VOIP或kAudioSessionCategory_PlayAndRecord。但是,如果您想錄制/傳輸從麥克風拾取的語音並播放來自網絡包的傳入數據:Here是一個很好的示例,其中包含麥克風和播放。另外如果你還沒有從蘋果公司讀過這篇文檔,我會強烈推薦this

簡而言之:您需要創建一個AudioUnits實例。在其中配置兩個回調:一個用於麥克風,一個用於回放。回撥話筒功能將爲您提供從話筒拾取的數據。然後,您可以使用任何選定的網絡協議轉換並傳輸到其他設備。回放回調功能是您提供來自其他網絡設備的傳入數據進行回放的位置。

+1

我在搜索過程中沒有創建過這個示例,它幫了我很多,謝謝! – TheSquad

+0

謝謝你的帖子。我一直在尋找這個很長一段時間。現在你解決了我的問題。感謝很多,並祝你快樂開心新的一年。 –

+1

如何保存該錄音機的音頻緩衝區,請分享嗎? –

0

你可以看到this簡單的例子。它描述瞭如何使用遠程IO單元。瞭解這個例子後,你應該看PJSIP's audio driver。這些應該可以幫助您實現自己的解決方案祝你好運。