连接ffdshow Video Decoder失败

peRexwei 2012-07-23 03:02:50
一直执行添加Filter的操作都是成功的,但不知道为什么到了添加ffdshow Video Decoder时就出错了,即添加不成功!希望高手帮忙解决下!

//添加Capture Filter
hr = AddFilterByName(mGraph,CLSID_VideoInputDeviceCategory,wt,L"USB 视频设备",&pCap);
if (FAILED(hr))
{
AfxMessageBox("Can not add Capture Filter!");
return false;
}

//添加Infinite Pin Tee Filter
IBaseFilter *pInfinitePinTee;
hr = AddFilterByName(mGraph,CLSID_LegacyAmFilterCategory,L"Infinite Pin Tee Filter",L"Infinite Pin Tee Filter",&pInfinitePinTee);
if (FAILED(hr))
{
AfxMessageBox("Can not add Infinite Pin Tee Filter!");
return false;
}

//连接Capture Filter和Infinite Pin Tee Filter
//获取Capture Filter的捕获引脚
IPin *pCaptureOut = NULL;
pCaptureOut = GetOutPin(pCap,0);
if (FAILED(hr))
{
AfxMessageBox("Can not get Capture Filter capture Output pin!");
return false;
}
hr = ConnectFilters(mGraph,pCaptureOut,pInfinitePinTee);
if (FAILED(hr))
{
AfxMessageBox("Can not connect Capture Filter with Infinite Pin Tee Filter!");
return false;
}

//添加ffdshow Video Decoder Filter
IBaseFilter *pffdshowVdeoDecoder;
hr = AddFilterByName(mGraph,CLSID_LegacyAmFilterCategory,L"ffdshow Video Decoder",L"ffdshow Video Decoder",&pffdshowVdeoDecoder);
if (FAILED(hr))
{
AfxMessageBox("Can not add ffdshow Video Decoder Filter!");
return false;
}
...全文
375 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
peRexwei 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
换成这样定义试试:
EXTERN_GUID(CLSID_FFDshowDecoder, { 0x04FE9017, 0xF873, 0x410E, 0x87, 0x1E, 0xAB, 0x91, 0x66, 0x1A, 0x4E, 0xF7);
另外,你贴出的地址里有答案连接:
http://forum.doom9.org/showthread.php?p=1019696#post10196……
[/Quote]
谢谢你啊,刚刚没有开到那个贴中有答案连接啊,我在FFDShow的配置里设置了,现在可以添加了。。。
ArcRain 2012-07-26
  • 打赏
  • 举报
回复
换成这样定义试试:
EXTERN_GUID(CLSID_FFDshowDecoder, { 0x04FE9017, 0xF873, 0x410E, 0x87, 0x1E, 0xAB, 0x91, 0x66, 0x1A, 0x4E, 0xF7);
另外,你贴出的地址里有答案连接:
http://forum.doom9.org/showthread.php?p=1019696#post1019696
EDIT : never mind, I found why. This is because visual studio (or my executable) is not in the supported applications inside FFDShow configuration
如果换了定义还是添加不成功,试着在FFDShow的配置里把使用的应用程序范围更改下。
peRexwei 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
知道了GUID,就这样创建试试.
IBaseFilter *pF = 0;
HRESULT hr = CoCreateInstance(CLSID_FFDshowDecoder, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pF);
[/Quote]
当我添加了

EXTERN_C const GUID DECLSPEC_SELECTANY CLSID_FFDshowDecoder { 0x04FE9017, 0xF873, 0x410E, { 0x87, 0x1E, 0xAB, 0x91, 0x66, 0x1A, 0x4E, 0xF7 } };

到程序中,发现这个DECLSPEC_SELECTANY 没有定义,请问这个的宏定义是什么?我看http://social.msdn.microsoft.com/Forums/zh-CN/windowsdirectshowdevelopment/thread/68f84c85-4643-4ffa-b1cd-36047d9bb5b5
这个网址的楼主也存在我这种情况,但是也没有找到解决方案!
ArcRain 2012-07-25
  • 打赏
  • 举报
回复
你的AddFilterByName是如何实现的?
GOOGLE了下,FFShow的Video Decoder Filter的GUID是
EXTERN_C const GUID DECLSPEC_SELECTANY CLSID_FFDshowDecoder { 0x04FE9017, 0xF873, 0x410E, { 0x87, 0x1E, 0xAB, 0x91, 0x66, 0x1A, 0x4E, 0xF7 } };

peRexwei 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
在GraphEdit里试试能不能连上...
改成以下试试:
hr = AddFilterByName(mGraph,CLSID_LegacyAmFilterCategory,L"ffdshow Video Decoder",L"Video Decoder",&pffdshowVdeoDecoder);
[/Quote]

大侠,实验证明这方法也是行不通啊。。。。有没有有别的办法啊??
peRexwei 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
先试试graphedit ,在查下错误码是什么。建议直接从GraphEdit 中手动查到ffdshow Video Decoder filter的guid,直接用它的guid链接
[/Quote]
我在宏定义里没有发现关于有ffdshow Video Decoder filter的对应guid,谢谢帮助!
peRexwei 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
在GraphEdit里试试能不能连上...
改成以下试试:
hr = AddFilterByName(mGraph,CLSID_LegacyAmFilterCategory,L"ffdshow Video Decoder",L"Video Decoder",&pffdshowVdeoDecoder);
[/Quote]
在GraphEdit里是可以连上的,我整个Graph Filter都是先在GraphEdit里手动连接上去的,那我先试一下您说的添加方式!谢谢帮忙。。。
ArcRain 2012-07-25
  • 打赏
  • 举报
回复
知道了GUID,就这样创建试试.
IBaseFilter *pF = 0;
HRESULT hr = CoCreateInstance(CLSID_FFDshowDecoder, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pF);
peRexwei 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
你的AddFilterByName是如何实现的?
GOOGLE了下,FFShow的Video Decoder Filter的GUID是
EXTERN_C const GUID DECLSPEC_SELECTANY CLSID_FFDshowDecoder { 0x04FE9017, 0xF873, 0x410E, { 0x87, 0x1E, 0xAB, 0x91, 0x66, 0x1A, 0x……
[/Quote]
我的AddFilterByName是这样子的


//加入一个指定FriendlyName的Filter(只限添加DirectShow Filters)
HRESULT CDXGraph::AddFilterByName(IGraphBuilder *pGraph, REFCLSID clsidDeviceClass, LPWSTR szFriendlyName, LPCWSTR wszName, IBaseFilter **ppF)
{
if (!pGraph || !ppF)
return E_POINTER;

*ppF = 0;
IBaseFilter *pF = 0;

// 创建系统设备枚举器.
ICreateDevEnum *pDevEnum;
HRESULT hr =CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void**)&pDevEnum);
if ( FAILED(hr))
{
return hr;
}

// 创建所有指定Categorie的Filters 的枚举器.
IEnumMoniker *pEnum;
hr = pDevEnum->CreateClassEnumerator(clsidDeviceClass, &pEnum, 0);

if (FAILED(hr))
{
pDevEnum->Release ();
return hr;
}

// 逐一枚举DirectShow Filters,寻找指定FriendlyName的Filter
IMoniker *pMoniker;
ULONG cFetched;
while(pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag *pBag;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);

// 检查 FriendlyName.
VARIANT var;
var.vt = VT_BSTR;

hr = pBag->Read(L"FriendlyName", &var, NULL);
if(FAILED(hr))
{ //读FriendlyName错误
pBag->Release();
pMoniker->Release();
//继续枚举下一个Filter
continue;
}

if (lstrcmpW(var.bstrVal,szFriendlyName) == 0)
{
// 找到指定FriendlyName的Filter
IBaseFilter *pF = 0;

hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pF);

//将找到的Filter加入Filter Graph
if (SUCCEEDED(hr))
{
hr = pGraph->AddFilter (pF, wszName);

if (SUCCEEDED(hr))
*ppF = pF;
else
pF->Release ();
}

SysFreeString(var.bstrVal);
pBag->Release();
pMoniker->Release();
pEnum->Release();
pDevEnum->Release();

return hr;
}
SysFreeString(var.bstrVal);
pBag->Release();
pMoniker->Release();
}
//没有找到指定FriendlyName的Filter
pEnum->Release();
pDevEnum->Release();
return E_FAIL;
}

EXTERN_C const GUID DECLSPEC_SELECTANY CLSID_FFDshowDecoder { 0x04FE9017, 0xF873, 0x410E, { 0x87, 0x1E, 0xAB, 0x91, 0x66, 0x1A, 0x4E, 0xF7 } };
应该怎样添加进去?
ArcRain 2012-07-24
  • 打赏
  • 举报
回复
在GraphEdit里试试能不能连上...
改成以下试试:
hr = AddFilterByName(mGraph,CLSID_LegacyAmFilterCategory,L"ffdshow Video Decoder",L"Video Decoder",&pffdshowVdeoDecoder);
peRexwei 2012-07-24
  • 打赏
  • 举报
回复
大家帮忙看看啦。。。。。。
gamejzb 2012-07-24
  • 打赏
  • 举报
回复
先试试graphedit ,在查下错误码是什么。建议直接从GraphEdit 中手动查到ffdshow Video Decoder filter的guid,直接用它的guid链接
peRexwei 2012-07-23
  • 打赏
  • 举报
回复
自己先顶一下贴。。。。。希望各位帮忙看看什么问题

2,554

社区成员

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

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