5

我被指控将 VOIP 添加到游戏中(跨平台,所以不能使用 Apple gamekit 来做)。

现在有 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 的意图(仍然根据文档)。

当然,我找不到任何关于它的文档,音频单元仍然几乎没有文档......

任何人都会知道最好的方法是什么?

4

2 回答 2

9

我没有使用过 VOIP 或 kAudioSessionCategory_PlayAndRecord。但是,如果您想记录/传输从麦克风拾取的语音并播放来自网络包的传入数据:是一个很好的示例,其中包括麦克风和播放。此外,如果您尚未阅读 Apple 的此文档,我强烈推荐文档。

简而言之:您需要创建一个 AudioUnits 实例。在其中配置两个回调:一个用于麦克风,一个用于播放。回调麦克风函数将为您提供从麦克风拾取的数据。然后,您可以使用任何选择的网络协议转换并传输到其他设备。播放回调函数是您提供来自其他网络设备的传入数据以进行播放的地方。

于 2012-09-25T01:21:42.780 回答
0

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

于 2014-03-22T07:24:44.220 回答