SampleGrabber未调用BufferCB [英] BufferCB not being called by SampleGrabber

查看:120
本文介绍了SampleGrabber未调用BufferCB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用SampleGrabber获取音频数据,但是没有执行我的BufferCB方法。我在做什么错了? .GetTypeFromCLSID(CLSID_SampleGrabber));
hr = pGraph.AddFilter(pSampleGrabber, SampleGrabber);
checkHR(hr,无法添加Sample Grabber);

AMMediaType pSampleGrabber_pmt = new AMMediaType();
//pSampleGrabber_pmt.majorType = MediaType.Audio;
pSampleGrabber_pmt.subType = MediaSubType.PCM;
pSampleGrabber_pmt.formatType = FormatType.WaveEx;
pSampleGrabber_pmt.fixedSizeSamples = true;
pSampleGrabber_pmt.formatSize = 18;
pSampleGrabber_pmt.sampleSize = 2;

WaveFormatEx pSampleGrabber_Format = new WaveFormatEx();
pSampleGrabber_Format.wFormatTag = 1;
pSampleGrabber_Format.nChannels = 1;
pSampleGrabber_Format.nSamplesPerSec = 48000;
pSampleGrabber_Format.nAvgBytesPerSec = 96000;
pSampleGrabber_Format.nBlockAlign = 2;
pSampleGrabber_Format.wBitsPerSample = 16;
pSampleGrabber_pmt.formatPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(pSampleGrabber_Format));
Marshal.StructureToPtr(pSampleGrabber_Format,pSampleGrabber_pmt.formatPtr,false);
hr =(((ISampleGrabber)pSampleGrabber).SetMediaType(pSampleGrabber_pmt);
DsUtils.FreeAMMediaType(pSampleGrabber_pmt);
checkHR(hr,无法将媒体类型设置为样本采集器);

ISampleGrabber pGrabber = new SampleGrabber()as ISampleGrabber;
pGrabber =(ISampleGrabber)pSampleGrabber;
pGrabber.SetCallback(null,1);

我的BufferCB方法就像

  public int BufferCB(double SampleTime,IntPtr pBuffer,int BufferLen)
{

返回0;
}


解决方案

您创建并配置了一个实例 pSampleGrabber ,然后将回调附加到另一个未使用的空闲实例 pGrabber



您需要

  pSampleGrabber作为ISampleGrabber 

而不是

 新SampleGrabber()as ISampleGrabber 


I'm using a SampleGrabber to get audio data, however my BufferCB method is not being executed. What am I doing wrong ?

//add Sample Grabber
            IBaseFilter pSampleGrabber = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SampleGrabber));
            hr = pGraph.AddFilter(pSampleGrabber, "SampleGrabber");
            checkHR(hr, "Can't add Sample Grabber");

        AMMediaType pSampleGrabber_pmt = new AMMediaType();
        //pSampleGrabber_pmt.majorType = MediaType.Audio;
        pSampleGrabber_pmt.subType = MediaSubType.PCM;
        pSampleGrabber_pmt.formatType = FormatType.WaveEx;
        pSampleGrabber_pmt.fixedSizeSamples = true;
        pSampleGrabber_pmt.formatSize = 18;
        pSampleGrabber_pmt.sampleSize = 2;

        WaveFormatEx pSampleGrabber_Format = new WaveFormatEx();
        pSampleGrabber_Format.wFormatTag = 1;
        pSampleGrabber_Format.nChannels = 1;
        pSampleGrabber_Format.nSamplesPerSec = 48000;
        pSampleGrabber_Format.nAvgBytesPerSec = 96000;
        pSampleGrabber_Format.nBlockAlign = 2;
        pSampleGrabber_Format.wBitsPerSample = 16;
        pSampleGrabber_pmt.formatPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(pSampleGrabber_Format));
        Marshal.StructureToPtr(pSampleGrabber_Format, pSampleGrabber_pmt.formatPtr, false);
        hr = ((ISampleGrabber)pSampleGrabber).SetMediaType(pSampleGrabber_pmt);
        DsUtils.FreeAMMediaType(pSampleGrabber_pmt);
        checkHR(hr, "Can't set media type to sample grabber");

        ISampleGrabber pGrabber = new SampleGrabber() as ISampleGrabber; 
        pGrabber = (ISampleGrabber)pSampleGrabber;
        pGrabber.SetCallback(null, 1);

My BufferCB method is like

public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
        {

            return 0;
        }

解决方案

You created and configured one instance pSampleGrabber and then you are attaching your callback to another unused idling instance pGrabber.

You need

pSampleGrabber as ISampleGrabber

instead of

new SampleGrabber() as ISampleGrabber

这篇关于SampleGrabber未调用BufferCB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆