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