将抓取的音频样本(在BYTE中)流式传输到音频渲染器过滤器

时间:2011-02-28 05:17:38

标签: c++ visual-studio-2008 audio directshow

我编写了一个程序,使用ISampleGrabber将样本音频从麦克风连续传输到缓冲区。

我非常确定该计划的所有其他部分。 但是以下部分将样本放入缓冲区是我不太确定的。

void MICDetect::Run_Graph(IMediaControl* m_pControl)
{
    m_hr = m_pControl->Run();// Now run the graph, i.e. start listening!
    if(SUCCEEDED(m_hr))
        {
            cout<<"Graph is Running"<<endl;
        }
    else HR_Failed(m_hr);
    cout<<"Waiting for buffer";
    for(int i=5;i>=1;--i)
    {
        Sleep(500);
        cout<<".";
    }
    cout<<endl;
    m_hr = m_pGrabber->GetCurrentBuffer(&m_Size, NULL);
    if(FAILED(m_hr))
    {
        HR_Failed(m_hr);
    }
     pBuffer = (BYTE*)CoTaskMemAlloc(m_Size);
    if (!pBuffer)
    {
        m_hr = E_OUTOFMEMORY;
        HR_Failed(m_hr);
    }
    for(int i=1000000;i>1;i--)
    {
        Sleep(1);
    m_hr = m_pGrabber->GetCurrentBuffer(&m_Size, (long*)pBuffer);
    if (FAILED(m_hr))
    {
        HR_Failed(m_hr);
    }

    }
system("pause");
}

我需要每秒1000个样本的样本才能开始

我暂停getcurrentbuffer 1ms并循环播放。

我不确定这些方法。

我唯一能确定的方法是将抓取的样本流式传输到音频渲染过滤器。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

根据您在致电ISampleGrabber::SetBufferSamples之前需要致电ISampleGrabber::GetCurrentBuffer的文档。但我建议使用ISampleGrabber::SetCallback使用回调函数。然后你不需要使用循环和睡眠。

无论哪种方式,你得到的是字节。根据格式,每个音频样本使用1个或多个字节。例如,16位立体声每个样本使用4个字节。如果您只是将字节写入文件(例如test.pcm),则有一些音频编辑器可以打开并播放它,例如coolingit95。打开文件时,您必须输入您使用的pcm格式。 最好将其写入.wav文件,然后您可以使用每个媒体播放器打开该文件。但这需要您了解.wav文件格式。