iOS音频单元RemoteIO录制时播放

5

我被委托将VOIP添加到一款游戏中(跨平台,因此不能使用苹果的游戏工具包来实现)。

现在已经尝试了3到4天,试图理解音频单元和remoteIO... 我查看了数十个示例,但每次都只是将简单的算法应用于输入PCM,并将其播放回扬声器。 根据苹果的文档,为了进行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个回答

9

我没有使用过VOIP或kAudioSessionCategory_PlayAndRecord。但是如果您想录制/传输从麦克风捕获的声音并播放来自网络包的传入数据:这里有一个良好的示例,包括麦克风和播放。此外,如果您还没有阅读Apple的这篇文档,则强烈建议您阅读这篇

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


1
在我的搜索中我没有找到这个示例,它对我很有帮助,谢谢! - TheSquad
非常感谢您的帖子。我已经寻找了很长时间。现在你解决了我的问题。非常感谢并祝您新年快乐。 - SURESH SANKE
1
如何保存录音缓冲区,请分享一下吗? - h.kishan
非常感谢!我一直在努力理解流程和如何使用 AU。 - YYfim

0

您可以查看this的简单示例。它描述了如何使用远程IO单元。在理解了这个示例之后,您应该观看PJSIP的音频驱动程序。这些都应该有助于您实现自己的解决方案。祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接