端口音频遍历音频数据

PortAudio iterate through audio data

本文关键字:音频 数据 遍历      更新时间:2023-10-16

由于我是PortAudio的新手,我尝试了一个来自互联网的示例程序。该程序能够通过回调功能记录麦克风的输入。

我想获取表示为数值(例如浮点数)录制音频的每个样本。我无法弄清楚麦克风的录制数据存储在哪里。

这是回调函数:

static int recordCallback(const void *inputBuffer, void *outputBuffer,
    unsigned long framesPerBuffer,
    const PaStreamCallbackTimeInfo* timeInfo,
    PaStreamCallbackFlags statusFlags,
    void *userData)
{
    paTestData *data = (paTestData*)userData;
    const SAMPLE *rptr = (const SAMPLE*)inputBuffer;
    SAMPLE *wptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS];
    long framesToCalc;
    long i;
    int finished;
    unsigned long framesLeft = data->maxFrameIndex - data->frameIndex;
    (void)outputBuffer; /* Prevent unused variable warnings. */
    (void)timeInfo;
    (void)statusFlags;
    (void)userData;
    if (framesLeft < framesPerBuffer)
    {
        framesToCalc = framesLeft;
        finished = paComplete;
    }
    else
    {
        framesToCalc = framesPerBuffer;
        finished = paContinue;
    }
    if (inputBuffer == NULL)
    {
        for (i = 0; i<framesToCalc; i++)
        {
            *wptr++ = SAMPLE_SILENCE;  /* left */
            if (NUM_CHANNELS == 2) *wptr++ = SAMPLE_SILENCE;  /* right */
        }
    }
    else
    {
        cout << endl << "SAMPLE" << endl;
        for (i = 0; i<framesToCalc; i++)
        {
            *wptr++ = *rptr++;  /* left */
            //cout << rptr<<endl;
            if (NUM_CHANNELS == 2) *wptr++ = *rptr++;  /* right */
        }
    }
    data->frameIndex += framesToCalc;
    return finished;
}

音频输入流在此处初始化:

err = Pa_OpenStream(
        &stream,
        &inputParameters,
        NULL,                  /* &outputParameters, */
        SAMPLE_RATE,
        FRAMES_PER_BUFFER,
        paClipOff,      /* we won't output out of range samples so don't bother clipping them */
        recordCallback,
        &data);

传入数据存储在回调的inputBuffer指针中。根据调用Pa_OpenStream时使用inputParameters应该能够将输入缓冲区转换为相应数据类型的数组(例如,如果paFloat32用作示例格式,则可以将缓冲区解释为const float*)。

建议在回调

函数中将传入数据复制到另一个缓冲区中以进行进一步处理(在回调之外)。

多个通道样本在缓冲器中交错。例如,对于立体声输入inputBuffer[0]是左声道的第一个样本,inputBuffr[1]是右声道的第一个样本,inputBuffer[2]是左声道的第一个样本,依此类推。样本总数通过回调的framesPerBuffer参数提供。