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");
感謝您回答我的問題,我不僅需要將最終輸出記錄到文件中,還需要同時從耳機監控它。 – KL2KL
好吧,只需將聲音緩衝區保存到聲音回調中的文件中即可。 PS - 在使用麥克風作爲輸入時監控麥克風很可能會導致反饋,除非您使用的是耳機或耳機揚聲器。 – jaybers