【问题标题】:PortAudio iterate through audio dataPortAudio 遍历音频数据
【发布时间】:2016-06-27 20:06:15
【问题描述】:

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

我想将录制音频的每个样本表示为数值(例如浮点数)。我不知道麦克风的记录数据存储在哪里。

这是回调函数:

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);

【问题讨论】:

    标签: c++ audio portaudio


    【解决方案1】:

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

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

    多个通道样本在缓冲区中交错。例如对于立体声输入,inputBuffer[0] 是左声道的第一个采样,inputBuffr[1] 是右声道的第一个采样,inputBuffer[2] 是左声道的第二个采样,等等。采样总数通过以下方式提供framesPerBuffer 回调参数。

    【讨论】:

    • 你能告诉我初始化时的哪些参数(第二个代码片段)是 inputBuffer 吗?我现在明白了它在回调中的位置。
    • @bingoStack 初始化时没有输入缓冲区。它将通过回调函数传递给您。您可以通过 inputParameters 结构进行调整,以告知您想要多少通道以及样本格式是什么,请参阅portaudio.com/docs/v19-doxydocs/structPaStreamParameters.html
    • 谢谢!虽然,我无法读取数据。我刚刚添加了cout &lt;&lt; *(float*)(inputBuffer) &lt;&lt; endl;在回调中 return finished 之前,我得到 0 或 +/- 3.0517e-005。怎么了?
    • @bingoStack 您确实可以通过*(const float*)(inputBuffer) 获得第一个样本。还要检查您是否从正确的设备录制(请参阅 inputParameters 中的设备索引)。
    • 谢谢;麦克风已停用。
    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2012-09-18
    • 2011-03-04
    • 2015-10-20
    • 2012-11-19
    相关资源
    最近更新 更多