C++ 从directshow过滤器图形访问原始wav数据

C++ 从directshow过滤器图形访问原始wav数据,c++,audio,directshow,C++,Audio,Directshow,下面的代码将很高兴地加载到mp3中并播放,但我需要检索原始wav数据,如果可能的话。我该怎么做?我知道如何使用IAMMultediaStream,但微软建议最好在图形上使用过滤器,我只是找不到任何文档或示例。我认为播放声音文件是最难的部分,访问原始数据也很容易 IGraphBuilder* pGraph; // Use its member function CoCreateInstance to //create the COM object and obtain the IGra

下面的代码将很高兴地加载到mp3中并播放,但我需要检索原始wav数据,如果可能的话。我该怎么做?我知道如何使用IAMMultediaStream,但微软建议最好在图形上使用过滤器,我只是找不到任何文档或示例。我认为播放声音文件是最难的部分,访问原始数据也很容易

    IGraphBuilder* pGraph;

// Use its member function CoCreateInstance to 
//create the COM object and obtain the IGraphBuilder pointer.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);

if(FAILED(hr)){ /*... handle hr error*/ }

// Use the overloaded -> operator to call the interface methods.
std::wstring ws;
ws.assign(rInFilename.begin(), rInFilename.end());
hr = pGraph->RenderFile(ws.c_str(), NULL);
if(FAILED(hr)){ /*... handle hr error*/ }

// Declare a second smart pointer and use it to  
// obtain another interface from the object.
IMediaControl* pControl;
IMediaEvent* pEvent;

hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

// Use the second interface.
hr = pControl->Run();
if(FAILED(hr)){ /*... handle hr error*/ }

// Use the third interface. 
long evCode = 0;
pEvent->WaitForCompletion(INFINITE, &evCode);
编辑:我应该链接到microsoft文档,说明如何使用streams执行此操作


简短回答,编写您自己的筛选器并将其添加到图表中。这是我的问题,如何编写筛选器?您是否查看了Microsoft示例?无需编写过滤器,您就可以使用示例抓取器访问数据,但它也已被弃用,并且在最新的操作系统中不可用。在旧版SDK中,样本采集器作为样本/源提供,可以作为一个良好的起点。