2015-09-20 85 views
1

從書籍「學習核心音頻」中,我已經學會了如何混合流1(話筒來自語音)和流2(語音合成器),然後將其輸出 連接到outputUnit(揚聲器)。 現在我試圖記錄它的輸出,同時監聽揚聲器的輸出。 因此,我設置了一個Splitter單元,將mixerUnit的輸出連接到它的輸入, 將其outputScope 0連接到outputUnit,將一個renderCallback(用於記錄)設置爲它的outputScope 1.(我認爲Splitter Unit將輸入流分成總線0和總線1) 結果是我可以從揚聲器聽到它,但renderCallback從來沒有被稱爲「拉模型」,因爲它沒有連接到任何輸出單元。 但是,如果我建立了另一個通用輸出單元然後連接到它,AUGraph向我顯示了一條錯誤消息(允許沒有2個輸出單元) 任何人都可以幫我解決這個問題嗎?如何在覈心音頻中設置分離器單元

CheckError(AUGraphNodeInfo(player->graph, 
          outputNode, 
          NULL, 
          &player->outputUnit), 
      "AUGraphNodeInfo failed"); 

CheckError(AUGraphNodeInfo(player->graph, 
          speechNode, 
          NULL, 
          &player->speechUnit), 
      "AUGraphInfo failed"); 

AudioUnit mixerUnit; 
CheckError(AUGraphNodeInfo(player->graph, 
          mixerNode, 
          NULL, 
          &mixerUnit), 
      "AUGraphNOdeInfo failed"); 

AudioUnit splitterUnit; 
CheckError(AUGraphNodeInfo(player->graph, 
          splitterNode, 
          NULL, 
          &splitterUnit), 
      "AUGraphInfo failed"); 

CheckError(AudioUnitSetProperty(mixerUnit, 
           kAudioUnitProperty_StreamFormat, 
           kAudioUnitScope_Input, 
           0, 
           &player->streamFormat, 
           propertySize), 
      "Couldn't set stream format on mixer unit bus 0"); 

CheckError(AudioUnitSetProperty(mixerUnit, 
           kAudioUnitProperty_StreamFormat, 
           kAudioUnitScope_Input, 
           1, 
           &player->streamFormat, 
           propertySize), 
      "Couldn't set stream format on mixer unit bus"); 

CheckError(AudioUnitSetProperty(splitterUnit, 
           kAudioUnitProperty_StreamFormat, 
           kAudioUnitScope_Input, 
           0, 
           &player->streamFormat, 
           propertySize), 
      "Couldn't set stream format on Splitter unit"); 

CheckError(AUGraphConnectNodeInput(player->graph, 
            splitterNode, 
            0, 
            outputNode, 
            0), 
      "Couldn't connect splitter 0 to outputNode"); 

CheckError(AUGraphConnectNodeInput(player->graph, 
            speechNode, 
            0, 
            mixerNode, 
            1), 
      "Couldn't connect speech speechNode to mixer input(1)"); 

AURenderCallbackStruct callbackStruct; 
callbackStruct.inputProc = GraphRenderProc; 
callbackStruct.inputProcRefCon = player; 
CheckError(AudioUnitSetProperty(mixerUnit,//was outputUnit 
           kAudioUnitProperty_SetRenderCallback, 
           kAudioUnitScope_Input, 
           0, 
           &callbackStruct, 
           sizeof(callbackStruct)), 
      "Couldn't set render callback on mixer unit"); 

AURenderCallbackStruct recorderCallback; 
recorderCallback.inputProc = recordRenderProc; 
recorderCallback.inputProcRefCon = player; 

CheckError(AudioUnitSetProperty(splitterUnit, 
           kAudioUnitProperty_SetRenderCallback, 
           kAudioUnitScope_Output, 
           0, 
           &recorderCallback, 
           sizeof(recorderCallback)), 
      "Couldn't set render callback on splitter output"); 

回答

0

你只是想記錄你的最終混合輸出到一個文件?

如果是這樣,你可以在你的渲染回調中寫入文件。但是,你不能阻止很長時間。在下次回調之前,你必須完成你的寫作。最簡單的寫法可能是使用宏中央調度來異步寫入文件。

+0

感謝您回答我的問題,我不僅需要將最終輸出記錄到文件中,還需要同時從耳機監控它。 – KL2KL

+0

好吧,只需將聲音緩衝區保存到聲音回調中的文件中即可。 PS - 在使用麥克風作爲輸入時監控麥克風很可能會導致反饋,除非您使用的是耳機或耳機揚聲器。 – jaybers

相關問題