端口音频处理立体声
Posted
技术标签:
【中文标题】端口音频处理立体声【英文标题】:Port Audio process stereo 【发布时间】:2015-06-02 14:42:22 【问题描述】:我是 PortAudio 的新手。我将它与 C++ Wrapper 标头一起使用。
http://sdr.f4gkr.org/trac/browser/gkSDR/Logiciel/audio/pawrapper.h?rev=5
我需要知道如何才能接收立体声输入并将其分解为两个单独的通道。
我正在通过此代码从一个通道输入。
inputStreamParam.channelCount = 2;
inputStreamParam.device = Pa_GetDefaultInputDevice();
inputStreamParam.sampleFormat = paFloat32;
inputStreamParam.suggestedLatency = suggestedLatency;
inputStreamParam.hostApiSpecificStreamInfo = NULL;
if(outputStreamParam.device > 0)
sampleRate = getDefaultSampleRate(outputStreamParam.device);
else
sampleRate = 44100.0;
frameLength = 1024; //set to a useful value
int paWrapper::startAudio(void)
if(isRunning) return pawErrorAudioIsRunning;
isRunning=true;
err = Pa_OpenStream(&stream,
&inputStreamParam,
&outputStreamParam,
sampleRate,
frameLength,
paNoFlag,
&paWrapper::paStaticCallback,
this);
if(err != paNoError)
isRunning=false;
return err;
int err = Pa_StartStream( stream );
if(err != paNoError)
isRunning=false;
return err;
我应该如何修改才能通过我的立体声麦克风分别获取两个通道,然后分别处理它们?
【问题讨论】:
【参考方案1】:当您调用Pa_OpenStream(...)
时,倒数第二个参数是一个回调函数,这是音频处理的核心。看起来您的包装器正在使用函数paStaticCallback
。通过查看包装器,我看到它调用了另一个函数userdata->processingCallBack(...)
,这是Pa_OpenStream(...)
函数的最后一个参数。您已将this
作为参数放在那里。
所以你需要重写processingCallback()
函数。
PortAudio 文档中有更多详细信息,但该函数中的第一个参数是指向输入缓冲区的 void 指针。如果您有立体声输入,则每个通道都会交错。
例如,如果您以每个样本 16 位进行记录,则该缓冲区的前两个字节(16 位)将是左通道样本,接下来的 2 个字节将是右通道样本。然后会重复。
您可以在该回调函数中提取每个通道。
当我在使用 PortAudio 时,examples 的例子对我很有帮助。
Here 是一个记录音频、将其存储在内存中并进行播放的示例。密切关注recordCallback
和playCallback
。
祝你好运。
【讨论】:
以上是关于端口音频处理立体声的主要内容,如果未能解决你的问题,请参考以下文章
音频处理使用 Adobe Audition 录制电脑内部声音 ( 启用电脑立体声混音 | Adobe Audition 中设置音频设备 | Adobe Audition 内录 )
音频处理Melodyne 导入音频 ( 使用 Adobe Audition 录制音频 | 在 Melodyne 中打开录制的音频 | Melodyne 对音频素材的操作 | 音频分析算法 )