2015-09-20 84 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

相关问题