2012-09-24 48 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。这些应该可以帮助您实现自己的解决方案祝你好运。