2011-02-28 99 views
0

我已经编写了一个程序,使用ISampleGrabber从麦克风连续采样音频到缓冲区。流式抓取的音频样本(BYTE)到音频渲染器过滤器

我非常确定该计划的其他部分。 但下面的部分抓取样本到缓冲区是我很不确定。

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为1毫秒和循环它。

我不确定这些方法。

我唯一确定的方法是将抓取的示例流式传输到音频呈现过滤器。

我该怎么做?

回答

0

根据您需要致电ISampleGrabber::SetBufferSamples的文件,致电ISampleGrabber::GetCurrentBuffer。但我会推荐使用使用ISampleGrabber::SetCallback的回调函数。那么你不需要使用循环和睡眠。

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