iosaudio单元remoteIO回放录音

我已经被指控将VOIP添加到游戏中(跨平台的,所以不能使用苹果游戏包来做)。

现在3或4天,我试图让我的头绕着audio单元和remoteIO …我忽略了几十个例子等,但每一次只是应用一个简单的algorithminputPCM和播放回到扬声器上。 根据苹果的文档,为了做VOIP,我们应该使用kAudioSessionCategory_PlayAndRecord。

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

1)但是在我看来,playAndRecord会一直播放来自麦克风(或更刺激的PerformThrucallback// aurioTouch ),我错了吗?

我有最简单的callback,除了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 } 

从那个callback我打算发送数据到同行(当然不是直接的,但数据将来自它)…

我看不出input的输出是怎样的,除了可能有2个单元,一个录音,一个播放,但似乎并不是苹果的意图(仍然归于文档)。

当然,我找不到任何有关它的文档,audio单元还是非常没有logging…

任何人都会有一个想法,什么是最好的办法呢?

我没有使用VOIP或kAudioSessionCategory_PlayAndRecord。 但是,如果您想录制/传输从麦克风拾取的语音并播放来自networking包的传入数据: 这是一个很好的示例,其中包括麦克风和播放。 另外,如果你还没有从苹果公司阅读这个文件,我会强烈推荐这个 。

简而言之:您需要创build一个AudioUnits实例。 在其中configuration两个callback:一个用于麦克风,一个用于回放。 回叫话筒function将为您提供从话筒拾取的数据。 然后,您可以使用任何选定的networking协议转换并传输到其他设备。 回放callbackfunction是您提供来自其他networking设备的传入数据进行回放的位置。

你可以看到这个简单的例子。 它描述了如何使用远程IO单元。 理解这个例子之后,你应该看PJSIP的audio驱动程序 。 这些应该可以帮助您实现自己的解决scheme 祝你好运。