RemoteIO:影响app产生的音频

时间:2012-10-22 17:47:05

标签: ios avfoundation core-audio audiounit remoteio

简而言之:有没有办法使用RemoteIO捕获/操作应用程序生成的所有音频?

我可以获得渲染回调,它允许我通过连接到输入示波器的RemoteIO输出总线将音频发送到扬声器。但是我在该回调中的输入缓冲区不包含AVPlayer在应用程序中其他地方生成的声音。是否可以操纵所有应用音频?

这是我的设置:

-(void)setup
{
    OSStatus status = noErr;

    AudioComponentDescription remoteIODesc;
    fillRemoteIODesc(&remoteIODesc);
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &remoteIODesc);

    AudioComponentInstance remoteIO;
    status = AudioComponentInstanceNew(inputComponent, &remoteIO);
    assert(status == noErr);

    AudioStreamBasicDescription desc = {0};
    fillShortMonoASBD(&desc);

    status = AudioUnitSetProperty(remoteIO,
                                  kAudioUnitProperty_StreamFormat,
                                  kAudioUnitScope_Input,
                                  0,
                                  &desc,
                                  sizeof(desc));
    assert(status == noErr);

    AURenderCallbackStruct callback;
    callback.inputProc = outputCallback;
    callback.inputProcRefCon = _state;

    status = AudioUnitSetProperty(remoteIO,
                                  kAudioUnitProperty_SetRenderCallback,
                                  kAudioUnitScope_Input,
                                  0,
                                  &callback,
                                  sizeof(callback));
    assert(status == noErr);

    status = AudioUnitInitialize(remoteIO);
    assert(status == noErr);

    status = AudioOutputUnitStart(remoteIO);
    assert(status == noErr);
}

1 个答案:

答案 0 :(得分:2)

简短的回答:不,不幸的是,它并没有这样做。您无法通过AVFoundation(从iOS 6开始)为您生成的音频添加任意处理。

您误解了RemoteIO设备的用途。 RemoteIO使您可以访问两件事:音频输入硬件和音频输出硬件。如同,您可以使用RemoteIO从麦克风获取音频,或将音频发送到扬声器。 RemoteIO设备不会让您抓取应用程序的其他部分(例如AVFoundation)发送到硬件的音频。没有深入研究,这是因为AVFoundation没有使用与RemoteIO一起使用的相同音频路径。

要在您想要的级别上操作音频,您将不得不比AVFoundation更深入。 Audio Queue Services是下一层,可让您以音频队列处理分流的形式访问音频。这可能是开始处理音频的最简单方法。但是,它还没有太多的文档。可能目前最好的来源是标题AudioToolbox.framework/AudioQueue.h请注意,这仅在iOS 6中引入。

Audio Units更深。这是RemoteIO单元所在的位置。您可以使用AUFilePlayer从音频文件生成声音,然后将该音频提供给其他音频单元进行处理(或自己动手)。这比AVFoundation(轻描淡写)更加棘手/冗长,但如果您已经设置了RemoteIO单元,那么您可以处理它。