directshow如何在SampleGrabber和Render中间连接一个解码器

Ginie 2011-09-06 06:14:44
在写directshow播放一个avi文件的程序,现在想添加一个抓图的功能,开始通过GetCurrentImage进行抓图的,可是速度太慢了,所以想用SampleGrabber来进行快速抓图,我在GraphEdit中自己拉了个图,效果如下

然后自己手动写程序连接,连接到SampleGrabber的时候不知道怎么找出我这个Xvid MPEG-4 Video Decoder来了,这个解码器filter在directshow filter中,我知道如何枚举出compress filter中的压缩filter,可是在directshow filter中的filter怎么枚举,我现在的图是下面这样

代码如下

//**申明的参数*****************
private:
void AddToObjectTable(void);
bool QueryInterfaces(void);
void RemoveFromObjectTable(void);
DWORD mObjectTableEntry;
IBasicAudio* mBasicAudio;
IMediaEventEx* mEvent;
IGraphBuilder* mGraph;
IVideoWindow* mVideoWindow;
IMediaSeeking* mSeeking;
IMediaControl* mMediaControl;
IBaseFilter *pSrc;
IBaseFilter *pGrabberF;
ISampleGrabber *pGrabber;
IBaseFilter *pNull;


//**建立图表的初始化方法************
bool CDXGraph::Create(void)
{ // 如果没有创建mGraph指针,创建一个,并初始化
HRESULT hr;
DWORD dwRegister;

if (!mGraph)
{
if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&mGraph))) // 创建未经初始化的mGraph
{
hr = CoCreateInstance(CLSID_SampleGrabber,NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pGrabberF);

hr = pGrabberF->QueryInterface(IID_ISampleGrabber,reinterpret_cast<void**>(&pGrabber));
hr = mGraph->AddFilter(pGrabberF, L"Sample Grabber");
AddToObjectTable(); // 添加进去

return QueryInterfaces();

#ifdef _DEBUG
hr = AddToRot(mGraph, &dwRegister);
#endif
}
mGraph = 0;
}
return false;
}

//**连接其他filter和开始播放文件的方法***********************
bool CDXGraph::RenderFile(const char *inFile)
{
HRESULT hr;
if (mGraph)//类IGraphBuilder
{
WCHAR szFilePath[MAX_PATH];//wide characer(16-bit);MAX_PATH=260
MultiByteToWideChar(CP_ACP, 0, inFile, -1, szFilePath, MAX_PATH);//字符转换mFilterGraph=>szFilePath
hr = mGraph->AddSourceFilter(szFilePath, L"Source", &pSrc);
hr = mGraph->AddFilter(pDecoder,L"Xvid MPEG-4 Video Decoder");
hr = ConnectFilters(mGraph, pSrc, pGrabberF);
if (!SUCCEEDED(hr))
{
return false;
}
// 找到当前的色深
HDC hdc = GetDC(NULL);
int iBitDepth = GetDeviceCaps(hdc, BITSPIXEL);
ReleaseDC(NULL, hdc);
// 设置媒体类型
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
switch (iBitDepth)
{
case 8:
mt.subtype = MEDIASUBTYPE_RGB8;
break;
case 16:
mt.subtype = MEDIASUBTYPE_RGB555;
break;
case 24:
mt.subtype = MEDIASUBTYPE_RGB24;
break;
case 32:
mt.subtype = MEDIASUBTYPE_RGB32;
break;
default:
return E_FAIL;
}
hr = pGrabber->SetMediaType(&mt);



hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pNull);

hr = mGraph->AddFilter(pNull, L"Null Render Filter");

hr = ConnectFilters(mGraph, pGrabberF, pNull);

hr = pGrabber->SetOneShot(TRUE);
hr = pGrabber->SetBufferSamples(TRUE);



}
return false;
}

各位大大帮帮我,我应该怎么样才能把解码器filter连上,然后再连上render
...全文
221 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sillman 2013-05-24
  • 打赏
  • 举报
回复
我的Sample grabber五发链接解码器和render。。。求大神的指点
ICTwangbiao 2012-11-15
  • 打赏
  • 举报
回复
如果只是抓图的话,不用Xvid MPEG-4 Video Decoder这个filter.直接从ISampleGrabber类继承一个自己的SampleGrabber类,注意重写那些关键函数之后,然后再回调函数BufferCB中得到每一帧图像的buffer,然后用一个自己的函数压缩成图像就行了. http://blog.csdn.net/ictwangbiao/article/details/8181710
zhangtiancy 2012-10-30
  • 打赏
  • 举报
回复
直接用RenderFile()函数智能连接不可以吗?
xmutbbs 2012-01-30
  • 打赏
  • 举报
回复
我也遇到这个问题了
xmutbbs 2012-01-30
  • 打赏
  • 举报
回复
我也遇到这个问题了
erichu126 2011-09-24
  • 打赏
  • 举报
回复
用GraphEdit查看一下,找到对应的解码器的filter,如
// ffdshow_MPEG_4_Audio_Decoder
DEFINE_GUID(CLSID_MPEG4_AudioDecoder,
0x0F40E1E5, 0x4F79, 0x4988, 0xB1, 0xA9, 0xCC, 0x98, 0x79, 0x4E, 0x6B, 0x55);

// ffdshow_MPEG_4_Video_Decoder
DEFINE_GUID(CLSID_MPEG4_VideoDecoder,
0x04FE9017, 0xF873, 0x410E, 0x87, 0x1E, 0xAB, 0x91, 0x66, 0x1A, 0x4E, 0xF7);
Ginie 2011-09-06
  • 打赏
  • 举报
回复
天那,难道真的没有人会么?
Ginie 2011-09-06
  • 打赏
  • 举报
回复
大家帮帮忙,解码Filter我应该怎么找到,我在Graphedit中先拖一个Samplegrabber,然后拉一个AVI文件进来后graphedit会自动给我连接起来生成一条链路,就是我上面发的。它自动生成的是有个Xvid MPEG-4 Video decoder,这个Filter我看了下是在directshow filter下面,但是在注册表下我没有找到这个filter,只有那个编码器的Xvid MPEG-4 coder,所以现在我不知道要如何查找出解码器的filter,大伙帮帮忙,谢谢了。
Ginie 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rageliu 的回复:]

取得对应的pin,然后手动连接就是了
[/Quote]可以具体点么?因为我现在不知道如何增加解码器的Filter。不知道如何遍历
rageliu 2011-09-06
  • 打赏
  • 举报
回复
取得对应的pin,然后手动连接就是了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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