directshow 问题

天天学习^好好向上 技术经理  2009-05-07 04:55:51
我用directshow写了一个程序,就是简单的使用IGraphBuilder直接RenderFile,

但是我在vc环境中debug时,发现生成的filtergraph和 不调试,直接运行,生成filtergraph不一样

在vc环境的解码filter和直接运行的filter用的不是同一个

但是程序是在同一台机器上,难道调试模式和运行模式,对与directshow还有什么不一样吗?

那个大侠遇到过这个问题啊,帮忙解决一下
...全文
65 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
UDX协议 2009-05-09
CyberLink Video/SP Decoder(PDVD7)应该是它有反调试技术。

如果你在debug模式下,他会不加载。

其实很多解码器,压缩器都会保护自己。
回复
我如果在debug模式,那么文件filter链路

MPEG2_ts.MPG->CyberLink Demux(PDVD7)->Microsoft MPEG-2 Video Decocde->VideoRenderer


如果不在debug模式,那么文件filter链路就会变成

MPEG2_ts.MPG->CyberLink Demux(PDVD7)->CyberLink Video/SP Decoder(PDVD7)->VideoRenderer

实际上第二个才是正确的,就是在DEBUG模式下不对,如果程序在debug模式下运行就异常了,不能放映,直接运行就能放映了


回复
我就是在graphedit中看到的,如果在VS2005中运行,graphedit用connect remote 查看,看到使用的解码器,是一个,如果不debug,直接从外部运行,用graphedit用connect remote 查看,看到的却是另外一个解码器,都是同一个程序,同一个机器,结果2种状态却不一样。

然后我找到了另外一个同事用bcb写的一个播放器,对于这个文件,在bcb的debug状态,和直接运行状态,2个的生成的图也不一样。

这directshow也真是太神奇了
回复
确实是这个问题,这个解码器在调试状态无法插入,可能确实保护了
回复
luckyboy101 2009-05-08
HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
IMoniker *pMoniker;
IRunningObjectTable *pROT;
if(FAILED(GetRunningObjectTable(0,&pROT)))
{
return E_FAIL;
}
WCHAR wsz[256];
wsprintfW(wsz,L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph,
GetCurrentProcessId());
HRESULT hr=CreateItemMoniker(L"!", wsz,&pMoniker);
if(SUCCEEDED(hr))
{
hr=pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE,pUnkGraph,
pMoniker,pdwRegister);
pMoniker->Release();
}
pROT->Release();
return hr;
}
void RemoveFromRot(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if(SUCCEEDED(GetRunningObjectTable(0,&pROT)))
{
pROT->Revoke(pdwRegister);
pROT->Release();
}
}


#ifdef _DEBUG
hr=AddToRot(pGraph,&dwRegister);
#endif

在graphedit中看看vc中的filter
回复
UDX协议 2009-05-07
一般不会出现,你可以注册到rot上,在ge中可以明确看到不同点。

如果真如你说的不同,请把filter链路的名字排出来,帮你分析一下。
回复
难道没有哪位遇到过这种问题吗?
回复
相关推荐
发帖
多媒体/流媒体开发
创建于2007-08-27

2453

社区成员

专题开发/技术/项目 多媒体/流媒体开发
申请成为版主
帖子事件
创建了帖子
2009-05-07 04:55
社区公告
暂无公告