2

一旦我们收到来自麦克风的任何输入,我就会使用播放音频。我正在使用OSStatus录制和播放音频。由于录音和播放工作正常。

我必须根据用户选择激活左侧耳机、右侧耳机或中心。在我研究 AudioBuffer时,我们必须为左、右和中耳机设置mNumberChannels 。这是我播放音频的代码。

    AudioBuffer buffer;

//    // 1 - Left
//    // 2 - Right
//    // 3 - Center
//    
    buffer.mNumberChannels = 0;


    buffer.mDataByteSize = inNumberFrames * 2;
    buffer.mData = malloc( inNumberFrames * 2 );

    // Put buffer in a AudioBufferList
    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0] = buffer;

    // Obtain recorded samples

    OSStatus status;

    status = AudioUnitRender([iosAudio audioUnit], 
                             ioActionFlags, 
                             inTimeStamp, 
                             inBusNumber, 
                             inNumberFrames, 
                             &bufferList);
    checkStatus(status);



    // Now, we have the samples we just read sitting in buffers in bufferList
    // Process the new data
    [audioProcess processAudio:&bufferList];

    free(bufferList.mBuffers[0].mData);

    return noErr;

但是,如果我更改mNumberChannels ,我将无法启用左、右或居中。谁能帮忙指出我的错误?

4

1 回答 1

0

AudioBuffer的正确值mNumberChannels可以从 mChannelsPerFrame 和 interleaved 标志导出。对于非交错格式,mNumberChannels 始终为 1。对于交错格式,mNumberChannels等于 mChannelsPerFrame。

因此mNumberChannels用于指定处理缓冲区中的通道数,而不是用于将音频平移或路由到“左”-“中”-“右”。所以设置 left=1, right=2, center=3 是错误的。

录制到音频缓冲区后,要进行平移(通过左/中/右选择音频播放),您应该将当前处理单元连接到多通道混音器单元(子类型kAudioUnitSubType_MultiChannelMixer),该单元接收任意数量的单声道或立体声流并将它们组合成单个立体声输出并支持每个输入的立体声平移

使用这个混音器单元,您可以使用类似kMultiChannelMixerParam_Pan的属性来控制左/中/右。

于 2015-03-02T04:23:30.977 回答