DirectShow IGraphBuilder::RenderFile问题

wodeww 2011-01-04 11:14:52
我是DShow新手,请教下高手,IGraphBuilder::RenderFile方法运行后,DirectShow会只能创建一个FilterGraph图吗?我研究了SDK的示例的代码并没有发现那里有选择Filter进行手动连接的地方,所以这里很疑惑,请高手指点一下,最好能带点示例代码附加指点。谢谢了!
...全文
606 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
王建野 2012-08-06
  • 打赏
  • 举报
回复
谢谢大家分享。
frankshcn 2011-01-11
  • 打赏
  • 举报
回复
根据文件格式不同,需要用不同的SourceFilter,常用的格式可以用CLSID_AsyncReader或CLSID_WMAsfReader打开,特殊格式情况就比较复杂。
添加SourceFilter后,还需要用以下代码打开文件:
IFileSourceFilter *pFileSource = NULL;
hr = m_pSource->QueryInterface( IID_IFileSourceFilter, (void**)&pFileSource );
hr = pFileSource->Load(FileName, NULL);
打开文件后,直接将SourceFilter与你需要的RenderFilter连接就可以播放文件了。
dengzikun 2011-01-10
  • 打赏
  • 举报
回复
DSHOW示例程序和baseclass中有类似的代码。
wodeww 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dengzikun 的回复:]

枚举到PIN的major type即可。
[/Quote]

能给一小段比较代码吗,判断major type的代码,谢谢!
dengzikun 2011-01-10
  • 打赏
  • 举报
回复
枚举到PIN的major type即可。
wodeww 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dengzikun 的回复:]

引用 6 楼 wodeww 的回复:
请问,如果我要在IGraphBuilder:Connect方法连接图中的两个Filter,我如何在SplitterFilter后面连接视频Filter或音频Filter呢,我枚举出来SplitterFilter两个Pin,如何确定哪一个是音频Pin哪一个是视频Pin呢?


枚举PIN媒体类型。
参考
[/Quote]

你好,我看了你给我的链接,我的问题是比方说AviSplitterFilter有2个OutPin,在GE上看到一个Stream00(视频流),还一个Stream01(音频流)。下面要开始建立链接 Stream00---->RenderVideoDefault Stream01---->RenderAudioDefault 我怎么确定这2个OutPin的哪一个该链接到视频渲染器上,哪一个链接到音频渲染器上啊?请高手指教!
dengzikun 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wodeww 的回复:]
请问,如果我要在IGraphBuilder:Connect方法连接图中的两个Filter,我如何在SplitterFilter后面连接视频Filter或音频Filter呢,我枚举出来SplitterFilter两个Pin,如何确定哪一个是音频Pin哪一个是视频Pin呢?
[/Quote]

枚举PIN媒体类型。
参考
wodeww 2011-01-10
  • 打赏
  • 举报
回复
请问,如果我要在IGraphBuilder:Connect方法连接图中的两个Filter,我如何在SplitterFilter后面连接视频Filter或音频Filter呢,我枚举出来SplitterFilter两个Pin,如何确定哪一个是音频Pin哪一个是视频Pin呢?
dengzikun 2011-01-09
  • 打赏
  • 举报
回复
简单的文件播放RenderFile就可以了。
如果需要在GRAPH链路中使用特定的FILTER,需要手动链接。
wodeww 2011-01-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 frankshcn 的回复:]
如果只需要播放单个媒体文件,可以使用IGraphBuilder::RenderFile方法渲染媒体文件。
如果针对应用需要,使用特定的Source Filter后,可以使用IGraphBuilder::Render方法实现对GraphBuilder中输出Pin进行渲染。
如果需要对渲染流程进行高级控的话,那就需要手动添加Filter并进行手动连接。
注意要实现播放,一个GraphBuilde……
[/Quote]
你好,我按照你的方法试了,有个问题,因为你这段里面没有写创建SourceFilter的代码,我不知道是不是需要创建SourceFilter。我自己的代码中创建了一个SourceFilter,但是返回失败了。
hr=CoCreateInstance(CLSID_FileSource,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(PVOID*)&pFilterSource);//这句报错

我想继续请教一下,最简单的文件播放,是不是要创建SourceFilter,如果不需要的话,那么在pFilter->Connect()中的输出Pin从哪里来啊?
CyberLogix 2011-01-04
  • 打赏
  • 举报
回复
如果系统中有相应注册的FILTER,RenderFile就会创建一个FilterGraph图,如果没有就会失败。
选择Filter进行手动连接,需要现创建fitler实例,软和取得PIN借口,在使用Connect函数和两外一个filter的PIN连接,这样一步一步构成一个FilterGraph
frankshcn 2011-01-04
  • 打赏
  • 举报
回复
如果只需要播放单个媒体文件,可以使用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);
wodeww 2011-01-04
  • 打赏
  • 举报
回复
能不能进一步说明,RenderFile会智能创建FilterGraph图?那么什么情况下,我们需要手动选择Filter,然后将选择Filter手动连接起来?求付代码说明!

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧