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

C# 如何使用SampleGrabber构建音频频谱/可视化工具?,c#,filter,directshow,C#,Filter,Directshow,我目前正在构建一个使用DS sdk的应用程序,我需要弄清楚如何不断地从音频源获取振幅,以绘制某种可视化工具或频谱。我一直在试图了解示例抓取器是如何在音频上实现的,但我发现的所有信息都已经过时,而且没有任何帮助。经过几十次尝试后,我现在得到的是: ISampleGrabber pGrabber = (ISampleGrabber)pSampleGrabber; hr = pGraph.ConnectDirect(GetPin(pInfinitePinTeeFilte

我目前正在构建一个使用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);
ISampleGrabber pGrabber=(ISampleGrabber)pSampleGrabber;
hr=pGraph.ConnectDirect(GetPin(pinfinitefilterfortaudio,“Output3”)、GetPin(pSampleGrabber,“Input”)、null;
支票hr(hr,“1040”);
如果(hr<0)返回false;
hr=pGraph.ConnectDirect(GetPin(pSampleGrabber,“Output”)、GetPin(pNullRenderer,“In”)、null;
支票hr(hr,“1041”);
如果(hr<0)返回false;
AMMediaType media=新的AMMediaType();
media.formatType=formatType.WaveEx;
pGrabber.GetConnectedMediaType(媒体)//获取并将媒体类型设置为媒体
pGrabber.SetBufferSamples(真);
int cbbuffer=0;
hr=pGrabber.GetCurrentBuffer(ref-cbbuffer,IntPtr.Zero);

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

如果您走上了正确的道路,您需要实现一个回调函数,样本采集程序可以使用该函数,这就是它的用途,C#等价物如下:

int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample pSample )
{
    //work with audio sample here
    return 0;
}
另外,请确保在图形中的样本抓取器之前有一个音频解码器,否则您将收到压缩样本


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

除了计算如何从样本抓取器中获取样本外,您是否还有一个有效的图表?是的,我的图表完全有效。如果需要这些信息,我有一个从网络中获取数据源并在本地播放的图表。如下所示:源->解复用->音频/视频解码器->inf-pin-tees->渲染器。该图也适用于连接的样本抓取器。我试着使用samplegrabberCB,但似乎只有两个相关功能:SampleCB和BufferCB,但我找不到太多相关文档。