2012-10-22 59 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單元,那麼你可以處理它。

相關問題