如何使用SampleGrabber为音频构建频谱/可视化工具?

时间:2011-01-04 15:16:49

标签: c# filter directshow

我目前正在构建一个使用DS sdk的应用程序,我需要弄清楚如何从音频源不断获取振幅以绘制可视化器或某种类型的光谱。我一直在努力研究如何在音频上实现样本采集器,但我发现的所有信息都已经过时,并且无益。经过几十次尝试,这就是我目前所拥有的:

        ISampleGrabber pGrabber = (ISampleGrabber)pSampleGrabber;
        hr = pGraph.ConnectDirect(GetPin(pInfinitePinTeeFilterAudio, "Output3"), GetPin(pSampleGrabber, "Input"), null);
        checkHR(hr, "1040");
        if (hr < 0) return false;
        hr = pGraph.ConnectDirect(GetPin(pSampleGrabber, "Output"), GetPin(pNullRenderer, "In"), null);
        checkHR(hr, "1041");
        if (hr < 0) return false;

        AMMediaType media = new AMMediaType();
        media.formatType = FormatType.WaveEx;
        pGrabber.GetConnectedMediaType(media); //gets and sets media type into media

        pGrabber.SetBufferSamples(true);
        int cbbuffer = 0;
        hr = pGrabber.GetCurrentBuffer(ref cbbuffer, IntPtr.Zero);

如何读取当前缓冲区上的内容,并继续读取缓冲区中的内容?

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上,你需要实现一个样本采集器可以使用的回调函数,这就是SampleCB的用途,C#等效函数将是这样的:

int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample pSample )
{
    //work with audio sample here
    return 0;
}

还要确保在图表中的样本抓取器之前有音频解码器,否则您将收到压缩样本。

还有一篇相关文章here可能会对您有所帮助。