2

我正在为 iOS 开发一个应用程序,它使用 RemoteIO 音频单元从麦克风录制音频,对其进行处理并输出到扬声器(耳机)。目前我使用单通道(单声道)进行输入和输出。

我想做的是允许用户选择输出扬声器:仅左、仅右或两者兼而有之。我当前的代码仅支持“两者”设置 - 两个扬声器发出相同的声音。

下面是我设置输入和输出总线的流格式(kAudioUnitProperty_StreamFormat)的方法:

AudioStreamBasicDescription ASBD = {0};
size_t bytesPerSample = sizeof(SInt16);
ASBD.mFormatID = kAudioFormatLinearPCM;
ASBD.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
ASBD.mSampleRate = 44100;
ASBD.mFramesPerPacket = 1;
ASBD.mBytesPerFrame = bytesPerSample;
ASBD.mBytesPerPacket = bytesPerSample;
ASBD.mBitsPerChannel = 8 * bytesPerSample;
ASBD.mChannelsPerFrame = 1;

我的渲染回调(kAudioUnitProperty_SetRenderCallback)大致如下:

AudioUnitRender(remoteIO, ioActionFlags, inTimeStamp, inputBus, inNumberFrames, ioData);
SInt16 *renderBuffer = ioData->mBuffers[0].mData;
// Process renderBuffer and modify the samples

实现仅左/仅右设置的最简单方法是什么?如果有任何相关内容,我不介意更改设备设置。

4

1 回答 1

2

最简单的方法是在您控制的两个 RemoteIO 元素(即输入范围的输出元素和输出范围的输入元素)上使用立体声 ASBD,并且只发送零作为非活动通道的样本,如果有的话。

RemoteIO 单元的即时格式转换能力有限,但它可以使用其内部格式转换器将来自麦克风的单声道流分成立体声流。

正确配置后,根据确切的 ASBD,您的渲染回调将接收缓冲区列表,这些缓冲区列表为每个通道(非交错)或单个交错缓冲区具有单独的缓冲区。您需要bzero其中一个缓冲区(非交错情况),或迭代样本并将它们静音(设置为零;交错情况)。

(注意:选择性通道静音可能会在您自己处理之后发生,因此您可能需要更改自己的代码以适应立体声数据。或者,将 RemoteIO 单元的输入范围的输出元素设置为发出单声道样本,执行您在那里进行处理,然后使用您自己的 AudioConverter 将流拆分为立体声。)

于 2012-05-30T20:24:51.957 回答