DirectShow IGraphBuilder::RenderFile问题
我是DShow新手,请教下高手,IGraphBuilder::RenderFile方法运行后,DirectShow会只能创建一个FilterGraph图吗?我研究了SDK的示例的代码并没有发现那里有选择Filter进行手动连接的地方,所以这里很疑惑,请高手指点一下,最好能带点示例代码附加指点。谢谢了!
[解决办法]
如果系统中有相应注册的FILTER,RenderFile就会创建一个FilterGraph图,如果没有就会失败。
选择Filter进行手动连接,需要现创建fitler实例,软和取得PIN借口,在使用Connect函数和两外一个filter的PIN连接,这样一步一步构成一个FilterGraph
[解决办法]
如果只需要播放单个媒体文件,可以使用IGraphBuilder::RenderFile方法渲染媒体文件。
如果针对应用需要,使用特定的Source Filter后,可以使用IGraphBuilder::Render方法实现对GraphBuilder中输出Pin进行渲染。
如果需要对渲染流程进行高级控的话,那就需要手动添加Filter并进行手动连接。
注意要实现播放,一个GraphBuilder中到少要有一个Source filter和一个Renderer。
下面是具体方法简单介绍:
1、创建GraphBuilder和Filter
IGraphBuilder *pBuilter;
IBaseFilter *pFilter;
hr = CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&m_pGraph );
hr = CoCreateInstance( IID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void **)&pFilter );
2、将Filter添加到GraphBuilder
pBuilder->AddFilter(pFilter);
3、取得两个Filter的输入输出Pin
HRESULT GetUnconnectedPin( IBaseFilter *pFilter,// Pointer to the filter.
PIN_DIRECTION PinDir,// Direction of the pin to find.
IPin **ppPin )// Receives a pointer to the pin.
{
*ppPin = 0;
IPin *pPin = 0;
IEnumPins *pEnum = 0;
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
return hr;
}
hr = pEnum->Reset();
while ( ( hr = pEnum->Next(1, &pPin, NULL) ) == S_OK)
{
PIN_DIRECTION ThisPinDir;
pPin->QueryDirection(&ThisPinDir);
if (ThisPinDir == PinDir)
{
IPin *pTmp = 0;
hr = pPin->ConnectedTo(&pTmp);
if (SUCCEEDED(hr)) // Already connected, not the pin we want.
{
pTmp->Release();
}
else // Unconnected, this is the pin we want.
{
pEnum->Release();
*ppPin = pPin;
return S_OK;
}
}
pPin->Release();
}
pEnum->Release();
// Did not find a matching pin.
return E_FAIL;
}
4、连接两个Filter
pBuilder->Connect(ppinIn, ppinOut);
[解决办法]
简单的文件播放RenderFile就可以了。
如果需要在GRAPH链路中使用特定的FILTER,需要手动链接。
[解决办法]