2012-10-22 26 views
0

简而言之:有没有一种方法可以捕获/操纵使用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); 
} 

回答

2

简短的回答:不,它不是这样的,很遗憾。您将无法对通过AVFoundation生成的音频添加任意处理(iOS 6以上版本)。

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

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

比这更深的是Audio Units。这是RemoteIO单元所在的地方。您可以使用AUFilePlayer从音频文件中产生声音,然后将该音频提供给其他音频单元进行处理(或自行完成)。这比AVFoundation(轻描淡写)要复杂得多,但如果你已经设置了RemoteIO单元,那么你可以处理它。

相关问题