首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将抓取的音频样本(字节)流式传输到音频渲染器过滤器

将抓取的音频样本(字节)流式传输到音频渲染器过滤器
EN

Stack Overflow用户
提问于 2011-02-28 13:17:38
回答 1查看 580关注 0票数 0

我已经写了一个程序,使用ISampleGrabber将麦克风中的样本音频连续放入缓冲区。

我对程序的所有其他部分都很有把握。但是下面的部分将样本抓取到缓冲区中是我不太确定的。

代码语言:javascript
复制
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,然后循环它。

我对这些方法不太确定。

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

我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2011-03-06 18:40:38

根据文档,在调用ISampleGrabber::GetCurrentBuffer之前需要先调用ISampleGrabber::SetBufferSamples。但我建议使用ISampleGrabber::SetCallback回调函数。这样你就不需要使用循环和休眠了。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5138476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档