2012-05-31 26 views
0

我正在使用SampleGrabber獲取音頻數據,但是我的BufferCB方法未被執行。我究竟做錯了什麼 ?BufferCB未被SampleGrabber調用

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

回答

1

您創建和配置一個實例pSampleGrabber,然後你是你的回調連接到另一個未使用的閒置情況pGrabber

你需要

pSampleGrabber as ISampleGrabber 

,而不是

new SampleGrabber() as ISampleGrabber 
+0

我得到「的對象引用需要非靜態字段,方法或屬性」 – CharlesBryan

+0

哦,等一下錯誤,你正在做的更奇怪的事情。 'pGrabber = new ...'完全沒用,因爲你正在立即發佈這個實例。 'SetCallback(null') - 你期望在這裏做什麼?你正在傳遞'null',你的回調是預期的... –

+0

哦,我明白了..所以我需要實現ISampleGrabberCB,然後把我的BufferCB實現在那裏? – CharlesBryan