gpt4 book ai didi

ios - 使用 Core Audio 控制单声道播放输出

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:52 25 4
gpt4 key购买 nike

我正在为 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

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

最佳答案

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

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

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

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

关于ios - 使用 Core Audio 控制单声道播放输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10823322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com