0

SampleGrabber を使用して音声データを取得していますが、BufferCB メソッドが実行されていません。私は何を間違っていますか?

//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);

私の BufferCB メソッドは次のようなものです

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

            return 0;
        }
4

1 に答える 1

1

1 つのインスタンスを作成して構成pSampleGrabberした後、コールバックを別の未使用のアイドリング インスタンスにアタッチしていますpGrabber

あなたが必要

pSampleGrabber as ISampleGrabber

それ以外の

new SampleGrabber() as ISampleGrabber
于 2012-05-31T08:22:24.590 に答える