我被指控将VOIP添加到游戏中(跨平台,所以不能使用Apple游戏套件来执行此操作)。
现在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将始终播放来自麦克风的内容(或更令人兴奋的是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的意图(仍然记录在文档中)。 / p>
当然,我找不到任何关于它的文档,音频单元仍然没有记录......
任何人都会知道最好的方法是什么?
答案 0 :(得分:8)
我没有使用过VOIP或kAudioSessionCategory_PlayAndRecord。但是,如果您想录制/传输从麦克风中拾取的语音并播放来自网络包的传入数据:Here是一个很好的示例,其中包括麦克风和播放。此外,如果您还没有从Apple阅读此文档,我强烈建议this。
简而言之:您需要创建一个AudioUnits实例。在其中,配置两个回调:一个用于麦克风,一个用于回放。回调麦克风功能将为您提供从麦克风中拾取的数据。然后,您可以使用任何选择的网络协议转换并传输到其他设备。播放回调功能是您从其他网络设备提供传入数据以进行播放的地方。
答案 1 :(得分:0)
您可以看到this简单示例。它描述了如何使用远程IO单元。了解此示例后,您应该看PJSIP's audio driver。这些应该可以帮助您实现自己的解决方案祝你好运。